Java面试必备:JVM内存与垃圾回收深度解析

需积分: 0 0 下载量 81 浏览量 更新于2024-06-19 收藏 11.65MB PDF 举报
"此资源是一个关于JAVA面试准备的知识汇总,涵盖了JVM内存结构、垃圾回收机制、引用类型以及常用的垃圾收集器等内容,旨在帮助求职者或Java开发者深入理解Java核心技术。" 在Java面试中,深入理解JVM(Java虚拟机)是至关重要的。JVM是Java程序运行的基础,它将Java代码编译成字节码后,负责执行这些字节码并管理内存。在JVM内存区域中,主要有以下几部分: 1. 程序计数器:每个线程都有自己的程序计数器,用于记录当前线程所执行的字节码指令的地址。 2. 虚拟机栈:同样为线程私有,存储了方法调用过程中的局部变量表、操作数栈、动态链接和方法出口等信息。 3. 本地方法区:为JNI(Java Native Interface)提供服务,存放C/C++等本地方法的栈。 4. 堆:所有线程共享,用于存储对象实例和数组。在Java 8之前,堆分为新生代和老年代;Java 8以后,使用元空间替代了永久代。 - 新生代:包括Eden区、两个Survivor区(From和To)。对象首先在Eden区创建,经历Minor GC后,存活的对象会移动到Survivor区,多次存活的对象将晋升到老年代。 - 老年代:存放长期存活的对象,一般采用标记整理算法进行垃圾回收。 - 永久代/元空间:存储类的元数据,如类的定义、方法信息等。 垃圾回收(GC)是JVM自动管理内存的重要机制,通过判断对象是否可达来决定是否回收。常见的垃圾识别方法有引用计数法和可达性分析。而垃圾回收算法主要包括: - 标记清除:标记出所有需要回收的对象,然后统一清除,缺点是可能导致内存碎片。 - 复制算法:将内存分为两块,每次只使用一块,当一块满时,将存活对象复制到另一块,然后清空。 - 标记整理:标记后,让所有存活对象向一端移动,然后清理边界外的内存。 - 分代收集:根据对象生命周期的不同,分别采用不同的算法,如新生代采用复制算法,老年代采用标记整理。 Java中存在四种不同类型的引用,它们对垃圾回收有不同的影响: - 强引用:最常见的引用类型,只要强引用存在,对象就不会被GC回收。 - 软引用:当系统内存不足时,会回收软引用对象,以避免系统出现OutOfMemoryError。 - 弱引用:比软引用更弱,无论内存是否充足,只要发生GC,都会回收弱引用对象。 - 虚引用:几乎不提供任何控制,主要用于跟踪对象在GC过程中的状态。 垃圾收集器的选择和配置对应用性能有很大影响,常见的有: - Serial收集器:单线程的,适用于轻量级应用或服务器的Client模式。 - ParNew收集器:Serial的多线程版本,常与CMS收集器配合使用。 - ParallelScavenge收集器:强调高吞吐量,适用于后台运算密集型应用。 - SerialOld收集器:Serial的老年代版本,使用标记整理算法。 了解并掌握这些JVM和垃圾回收的知识,对于Java面试和实际开发都是非常有益的。通过深入理解这些概念,可以更好地优化代码,提高应用程序的性能。