JVM 把内存切成几块,各装各的。面试常问:对象在哪?类在哪?
一、整体划分
JVM 内存分线程私有和线程共享两大部分。
二、线程私有
- 程序计数器
:当前线程执行到哪条指令,极小。 - 虚拟机栈
:每个方法调用一个栈帧,装局部变量、操作数栈。递归太深 → StackOverflowError。 - 本地方法栈
:Native 方法用的,类似虚拟机栈。
三、线程共享
- 堆(Heap)
:对象实例和数组都在这,GC 主战场。分新生代(Eden + 两个 Survivor)和老年代。 - 方法区 / 元空间(Metaspace)
:存类信息、常量、静态变量、方法字节码。JDK8 起用本地内存的元空间,取代永久代,不易 OOM。
四、一个对象的一生
new 出来的对象先放 Eden;GC 后活的进 Survivor,熬过几轮进老年代。大对象直接进老年代。
五、面试速记
-
栈(线程私有)装方法调用和局部变量;堆(共享)装对象。 -
堆分新生代 + 老年代。 -
元空间(JDK8)装类信息,取代永久代。 -
递归深 → 栈溢出;对象多 → 堆溢出。 -
字符串常量池 JDK7 后也在堆里。
六、一句话带走
栈装"怎么执行"(方法/局部变量),堆装"对象",元空间装"类"。记住对象在堆、类在元空间、变量在栈,内存模型就通了。
JVM面试
更多 Java 面试速通,关注公众号持续更新。

