深入理解JVM:内存模型与垃圾收集

需积分: 5 0 下载量 103 浏览量 更新于2024-08-05 收藏 815KB PDF 举报
"该资源为JVM面试专题的PDF文档,涵盖了JVM内存模型、对象创建、内存分配、垃圾收集和引用判定等核心知识点。" 1. JVM内存模型与分区: JVM内存主要分为五个区域:堆区、栈区、方法区、本地方法栈和程序计数器。堆区用于存储所有初始化的对象实例和数组,按照新生代(包括Eden和两个Survivor区,如From和To)与老年代划分,新生代采用复制算法进行垃圾收集,老年代则使用标记-压缩或标记-整理算法。栈区主要存放方法调用过程中的局部变量表、操作数栈和方法返回信息。方法区存储类信息、常量池、静态变量和编译后的字节码。本地方法栈为JNI调用的Native方法提供服务。程序计数器记录当前线程执行的指令位置。 2. 堆内存分区详解: 新生代由Eden和两个Survivor区组成,通常Eden空间较大,而Survivor区较小,以减少Minor GC的频率。对象首先在Eden区分配,经历Minor GC后,存活的对象被复制到Survivor区,经历多次GC后仍存活的对象进入老年代。老年代内存不足时,触发Full GC。 3. 对象创建与内存分配: 当使用`new`关键字创建对象时,JVM会在堆区分配内存,对于大对象可能直接进入老年代。对象的访问定位通常通过指针碰撞或空闲列表来实现,取决于内存是否连续分配。 4. 垃圾收集的判定方法: JVM主要使用可达性分析算法,即引用链法来决定对象是否可回收。它从一组称为GC Roots的对象出发,遍历引用链,无法达到的对象被视为可回收。引用计数法虽然简单,但无法处理循环引用问题,因此未被JVM采用。 5. SafePoint: SafePoint是在JVM执行代码的过程中,能够安全地暂停线程的特定点。在这些点,所有线程的状态都可以被一致地保存下来,以便于垃圾收集器进行工作,如执行Full GC时,需要确保所有线程都在SafePoint上暂停。 6. 其他相关概念: - Minor GC:针对新生代的垃圾收集,通常涉及Eden区和一个Survivor区。 - Major/Full GC:清理整个堆和方法区,通常发生在老年代空间不足或系统要求时。 - Metaspace:Java 8替代永久代存储类元信息的空间,可以动态调整大小以避免OOM异常。 这份面试专题文档深入讲解了JVM的关键概念,对理解Java程序的运行机制和优化非常重要。掌握这些知识能帮助开发者更好地理解和解决性能问题,提高系统的稳定性和效率。