JVM内存模型与面试详解
需积分: 10 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应用程序的性能和稳定性。
2024-06-17 上传
2023-03-15 上传
2021-09-23 上传
2023-09-06 上传
2023-09-26 上传
2024-01-11 上传
2023-05-24 上传
2023-05-20 上传
2024-03-07 上传
hujinglisson
- 粉丝: 0
- 资源: 14