Java JVM内存模型深度解析:堆与栈的分区与对象创建
版权申诉
5星 · 超过95%的资源 188 浏览量
更新于2024-09-12
收藏 493KB PDF 举报
"这份资料是2021年字节跳动公司面试中关于Java JVM相关的题目,主要涉及Java内存模型、对象创建、垃圾收集及其判定方法等方面的知识。"
1. Java内存模型与分区:
Java内存模型主要包括堆区、栈区、方法区、本地方法栈和程序计数器。其中:
- 方法区(在Java 8后改为元空间Metaspace)存储类信息、常量池、静态变量和编译后的字节码。
- 堆区用于存储所有对象实例和数组,包括初始化的对象和非静态成员变量。
- 栈区主要存放方法调用时的局部变量表、操作数栈和方法出口等信息,每个方法调用对应一个栈帧。
- 本地方法栈服务于JNI的本地方法。
- 程序计数器记录当前线程执行的指令位置。
2. 堆内存分区:
堆内存分为新生代(包括Eden和两个Survivor区,即from和to)以及老年代。新生代对象先在Eden区创建,经历Minor GC后,存活对象转移到Survivor区,多次GC后仍存活的对象进入老年代。当堆空间不足时,可能触发Full GC清理老年代。
3. 对象创建与内存分配:
创建对象通常使用`new`关键字,对象实例会分配在堆中,而对象引用则存储在栈中。对于大对象,可能直接在老年代分配以避免频繁的垃圾收集。
4. 垃圾收集判定方法:
- 引用计数法:简单但无法处理循环引用问题,因此Java未采用。
- 引用链法(可达性分析):通过GC Roots作为起点,如果对象不能被任何GC Roots引用,则认为可以被回收。
5. SafePoint:
SafePoint是在JVM执行过程中设定的一些特定点,当GC发生时,JVM会让所有线程同步到最近的SafePoint,以便安全地进行垃圾收集。这通常发生在方法调用、循环迭代等地方。
6. 对象的访问定位:
对象在内存中的位置由其引用指向,Java提供了几种不同的对象访问方式,如句柄访问和直接指针访问,具体实现取决于JVM实现。
这些知识点是Java性能优化和理解JVM工作原理的关键,对于开发者来说非常重要,特别是在大型互联网公司的面试中常常被考察。深入理解和掌握这些内容,能帮助我们编写更高效、更稳定的代码。
1701 浏览量
692 浏览量
218 浏览量
249 浏览量
168 浏览量
125 浏览量
236 浏览量