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

需积分: 10 5 下载量 88 浏览量 更新于2024-09-03 收藏 815KB PDF 举报
"该资源是关于JVM面试的专题PDF,涵盖了JVM内存模型、堆内存分区、对象创建与内存分配、垃圾收集机制以及引用判定方法等核心知识点。" 1. JVM内存模型与分区: - **方法区**:存储类信息,包括常量池(包含static常量和static变量)、元数据以及编译后的字节码。在Java 8之后,方法区被Metaspace取代,用于存储类元数据。 - **堆内存**:用于存储所有对象实例和数组,分为新生代(Young Generation)和老年代(Tenured Generation)。新生代包括Eden区和两个Survivor区(From和To),对象首先在Eden区创建,经历垃圾回收后存活的对象移至Survivor区,多次GC后仍存活的则进入老年代。 - **栈内存**:每个线程都有自己的独立栈,用于存储方法调用时的局部变量表、操作数栈、动态链接和方法返回地址等信息。栈内存中的数据生命周期与方法同步,方法结束时,对应的栈帧会被销毁。 - **本地方法栈**:为Java Native Interface (JNI)中的本地方法提供服务,与栈类似,但用于存储本地方法调用的信息。 - **程序计数器**:记录当前线程正在执行的字节码指令的行号,用于控制程序的执行流程。 2. 堆内存分区特点: - **新生代**:Eden区是大多数对象的诞生地,Survivor区用于在每次垃圾收集时复制存活对象,减少内存碎片。两个Survivor区交替作为From和To,以避免连续两次GC在同一区进行。 - **老年代**:存放长期存活的对象,当新生代对象经过多次GC后仍然存活,将被晋升至老年代。当老年代空间不足时,会触发Full GC。 3. 对象创建与内存分配: - 使用`new`关键字创建对象时,JVM会根据对象大小选择在堆内存的适当区域分配空间。对于大对象,可能会直接分配在老年代,以避免频繁的内存复制。 4. 垃圾收集(GC)判定方法: - 引用计数法:简单但无法处理循环引用问题,JVM未采用。 - 引用链法(可达性分析):从GC Roots出发,遍历引用链,无法到达的对象被视为可回收。GC Roots包括静态变量、活动线程栈中的局部变量、JNI引用等。 5. SafePoint: - 在执行Java代码的过程中,会有一些特定的位置(如方法调用、循环边界等)称为SafePoints,这些点允许GC暂停线程进行垃圾收集。在执行到SafePoint时,JVM可以确保所有线程的状态是可预测的,从而安全地执行垃圾收集。 这些知识点是JVM面试中常见的问题,深入理解它们有助于优化Java应用程序的性能并解决内存相关的问题。