JVM内存结构与对象生命周期

版权申诉
0 下载量 13 浏览量 更新于2024-09-09 收藏 686KB PDF 举报
"JVM面试专题.pdf 是一份深入探讨Java虚拟机(JVM)相关知识的文档,适合面试准备和学习。文档详细介绍了JVM的内存模型、对象创建与分配、垃圾收集机制以及相关的判断标准。" 在JVM内存模型中,主要分为以下几个区域: 1. 方法区(Method Area):存储类信息,包括常量池(包含static常量和static变量)、编译后的字节码等数据。在Java 8中,方法区被替换为元空间(Metaspace),用于存储类元数据。 2. 堆(Heap):用于存储所有对象实例和数组,无论是初始化的对象还是成员变量(非static)。堆内存分为新生代和老年代,新生代又细分为Eden区和两个Survivor区(From和To)。新生代对象首先在Eden区分配,经历垃圾收集后,存活的对象会被复制到Survivor区,多次幸存后则晋升到老年代。 3. 栈(Stack):每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。栈主要用于存储局部变量表、操作数栈、方法返回地址等信息,每执行一个方法,就会在栈上创建一个新的栈帧。 4. 本地方法栈(Native Method Stack):为Java方法以外的本地(Native)方法提供服务。 5. 程序计数器(PC Register):记录当前线程正在执行的字节码指令的地址,便于下一条指令的执行。 在堆内存中,新生代采用复制算法进行垃圾收集,当Eden区满时,存活对象会被复制到Survivor区之一,然后清空Eden。如果Survivor区不足以容纳所有存活对象,部分对象将直接进入老年代。老年代通常使用标记-清除或标记-压缩算法进行垃圾收集,以应对大对象和长期存活的对象。 对于对象创建,Java中最常见的方式是使用`new`关键字。对象的内存分配通常在堆上进行,访问定位则涉及对象头和句柄等概念,具体实现方式有直接指针、句柄和偏向锁等。 垃圾收集(GC)的判定方法主要有两种: 1. 引用计数法:跟踪对象的引用次数,但无法处理循环引用问题,因此JVM并未采用此方法。 2. 可达性分析(引用链法):通过GC Roots(如静态变量、系统运行时栈帧中的局部变量、方法区中的常量引用等)来判断对象是否可达。如果一个对象从任何GC Roots都无法通过引用链到达,那么它被认为是不可达的,可进行垃圾回收。 SafePoint是垃圾收集过程中的特定点,JVM在执行到这些点时,所有线程都将处于可中断状态,以便进行垃圾收集工作。这通常发生在方法调用、循环边界等位置,确保GC能安全地暂停程序执行。