【Java面试题】Java类对象都是在堆上分配的内存吗?
Java 的类对象都是在堆上分配内存吗,这是虚拟机面试中的一道经典题目,答案其实是否定的。文章先回顾标准虚拟机的内存划分:栈内存、堆内存、程序计数器、方法区与本地方法栈,其中每个线程都拥有独立的调用栈,方法调用依靠栈帧的创建与销毁来完成,引用变量与基础类型在栈帧内分配,而对象则在堆上分配。随后作者通过一个只在方法内部创建并使用的对象提出假想:既然它的生命周期与方法一致,如果直接在栈上分配内存,就能省去堆内存的寻址开销,也不必再依赖垃圾回收来释放。这个假想是成立的,其技术基础正是逃逸分析:当对象没有逃逸出所在方法时可以启用栈上分配甚至标量替换,没有逃逸出线程时则可以消除不必要的同步锁。文章列举了不同逃逸范围与对应的优化策略,并给出 HotSpot 的实现参考。