Hotspot虚拟机是否支持栈上分配?逃逸分析后未逃逸变量是否实现栈上分配?
Hotspot虚拟机栈上分配相关问题解答
1. Hotspot虚拟机是否支持栈上分配?
Hotspot虚拟机支持栈上分配,但这是一项基于逃逸分析的JIT优化特性,并非所有场景默认启用。从Java 7开始,Server模式下的Hotspot默认开启逃逸分析,进而支持栈上分配;若在Client模式下,需手动通过-XX:+DoEscapeAnalysis参数开启逃逸分析后,才能触发栈上分配优化。
2. 经过逃逸分析后变量未发生逃逸,Hotspot是否针对这类未逃逸变量实现了栈上分配?(注:此处并非指标量替换)
当逃逸分析判定对象未发生逃逸时,Hotspot确实会对这类对象执行栈上分配,这和标量替换是两种独立的优化手段:
- 栈上分配是直接将完整的对象实例分配到当前线程的栈帧空间中,当栈帧执行完毕销毁时,对象会随栈帧一起被释放,无需进入堆内存等待GC回收。
- 标量替换则是将对象拆解为多个基本类型或引用类型的标量,直接在栈上分配这些标量,而非分配完整对象。
栈上分配的触发完全依赖逃逸分析的结果,只有未逃逸的对象才会被选中进行该优化,以此降低堆内存占用和GC的开销。
内容的提问来源于stack exchange,提问作者maple
相关产品推荐
相关产品推荐

