JVM内存模型与面试详解

需积分: 10 0 下载量 148 浏览量 更新于2024-08-05 收藏 497KB PDF 举报
"该资源是关于JVM面试的专题及答案,涵盖了JVM内存模型、堆内存分区、对象创建与分配、垃圾收集机制以及安全点(SafePoint)等相关知识点。" 1. JVM内存模型及分区: JVM内存分为五个主要区域,分别是: - 方法区:存储类信息、常量池(包括static常量和static变量)、编译后的字节码等数据。 - 堆区:用于存放所有对象实例和数组,是JVM中最大的一块内存区域,支持动态内存分配。 - 栈区:每个线程都有自己的独立栈,用于存储方法调用过程中的局部变量表、操作数栈、方法出口等信息。 - 本地方法栈:为Java方法以外的Native方法服务。 - 程序计数器:记录当前线程正在执行的字节码指令的行号。 2. 堆内存分区: 堆内存分为新生代和老年代。新生代包含Eden和两个Survivor区(from和to)。当对象在Eden区创建后,经过垃圾收集,存活的对象会被复制到Survivor区,经历多次GC后仍存活的对象会进入老年代。如果新生代空间不足,大对象会直接进入老年代。老年代的内存回收通常触发Full GC。 3. 对象创建与内存分配: 使用`new`关键字创建对象时,JVM会在堆中分配内存。对象的引用存储在栈中,而对象实例存储在堆中。对于大对象,可能直接在老年代分配。 4. GC的判定方法: 垃圾收集有两种主要判定方式: - 引用计数法:简单但无法处理循环引用问题,JVM未采用。 - 可达性分析法(引用链法):通过GC Roots对象(如静态变量、系统栈中的引用等)追踪可达性,不可达的对象视为可回收。 5. SafePoint: SafePoint是在JVM执行过程中设定的一些特定点,使得在这些点上,所有的线程都能达到一个安全的状态,以便于垃圾收集器暂停执行(Stop-the-world)。例如,当线程执行到方法调用、循环跳转、异常跳转等指令时,会到达SafePoint。 这些知识点对于理解JVM的工作原理和优化非常重要,特别是在面试和解决性能问题时。理解并掌握这些内容有助于提升Java应用程序的性能和稳定性。