Java JVM与垃圾回收深度解析

需积分: 10 4 下载量 68 浏览量 更新于2024-07-17 收藏 10.71MB PDF 举报
"美团系统交易面试资料整理java" 这篇面试资料涵盖了Java开发中与JVM相关的深入知识点,包括线程、内存区域、垃圾回收机制以及相关的算法和引用类型。以下是这些知识点的详细说明: 1. **JVM内存区域**: - **程序计数器**:每个线程都有一个独立的程序计数器,用于记录当前线程执行的字节码指令地址。 - **虚拟机栈**:存储方法的局部变量、操作数栈、动态链接等信息,每个线程都有自己的虚拟机栈。 - **本地方法栈**:与虚拟机栈类似,但为JVM执行native方法服务。 - **堆**:所有对象实例和数组都在堆中分配内存,是线程共享的区域。 - **方法区/永久代**:存储类的信息,如类的元数据,不过在Java 8之后被元空间(Metaspace)替代。 2. **JVM运行时内存划分**: - **新生代**:包括Eden区、两个Survivor区(From和To)。对象首先在Eden区创建,经历Minor GC后,存活的对象会移动到Survivor区,并增加年龄。 - **老年代**:存放长期存活的对象,通常比新生代大,使用标记整理算法进行垃圾回收。 - **永久代/元空间**:存储类的元数据,与方法区相似,但不固定大小,根据需要动态扩展。 3. **垃圾回收与算法**: - **如何确定垃圾**:通过引用计数法和可达性分析来判断对象是否可达,从而确定是否为垃圾。 - **垃圾回收算法**:包括标记清除、复制、标记整理、分代收集等。每种算法各有优缺点,适用于不同的场景。 - **分代收集算法**:根据对象生命周期将内存划分为新生代和老年代,分别使用不同的垃圾回收策略。 4. **JAVA四中引用类型**: - **强引用**:默认的引用类型,只要强引用存在,垃圾回收器就不会回收对象。 - **软引用**:在系统将要发生内存溢出之前,会回收软引用关联的对象。 - **弱引用**:无论内存空间是否足够,只要进行垃圾回收,就会回收弱引用关联的对象。 - **虚引用**:无法直接获取对象,主要用于跟踪对象被垃圾回收的状态。 5. **GC分代收集算法VS分区收集算法**: - **分代收集算法**:针对不同生命周期的对象使用不同策略,新生代使用复制算法,老年代使用标记整理算法。 - **分区收集算法**:将堆内存划分为多个小的连续区域,可以提高内存分配效率和垃圾回收速度。 6. **GC垃圾收集器**: - **Serial**:单线程的垃圾收集器,使用复制算法,适合小型应用。 - **ParNew**:Serial的多线程版本,常配合CMS收集器使用。 - **ParallelScavenge**:多线程的复制算法收集器,侧重于吞吐量。 - **SerialOld**:单线程的老年代收集器,使用标记整理算法。 这些知识点是Java开发中的核心概念,理解并掌握它们对于优化程序性能、避免内存泄漏以及提升系统的稳定性至关重要。在面试中,熟悉这些内容能展示出候选人对Java内存管理的深入理解和实践经验。