JVM栈中存的到底是什么?是指针还是对象实例
作者:青衫码上行
还在纠结JVM栈里存的是指针还是对象?本文用通俗语言讲清栈与堆的区别,并详细拆解Java堆内存结构:新生代、老年代、元空间和大对象区,看完你就明白对象实例到底存在哪,以及Minor GC和Full GC的区别
栈中存的是指针还是对象?
堆栈说明:在JVM内存模型中,栈主要管理线程的局部变量与方法调用上下文;堆用于存储所有对象实例与数组。
解释:
- 栈中存储的是:基本类型的值 + 对象的引用(地址/指针),绝不存储完整对象
- 因此,栈中存的不是对象,而是指向对象的引用。
- 例如
MyObject obj = new MyObject(),obj是栈上的引用(64位机占8字节),真正的对象实例在堆中。
堆分为哪几部分?
Java堆是JVM内存管理核心区域,专门存放对象实例与数组。
堆的主要划分如下:

新生代(Young Generation)
- 分为
Eden与Survivor(S0 + S1)。 - 新对象优先在 Eden 分配;Eden 满后触发 Minor GC。
- 存活对象进入 Survivor,S0 和 S1 交替使用,用于筛选短命对象。
老年代(Old/Tenured Generation)
- 多次 Minor GC 后仍然存活的对象,会晋升到老年代。
- 老年代 GC 称为 Major GC,频率低、速度慢,常常伴随 Full GC。
元空间(Metaspace)
- JDK8+ 用元空间替代永久代,存储类元数据、方法信息、常量池等。
- 元空间不在堆里,使用本地内存,大幅减少 OOM 概率。
大对象区(Humongous Objects)
- G1 收集器特有:超过 Region 一半大小 的对象即为大对象。
- 直接分配在连续区域,逻辑上属于老年代,避免在 Survivor 间复制带来巨大开销。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
