是否可以强制JVM在堆栈之外的堆栈中创建对象?

vrn*_*mar 4 java heap stack jvm

我读了一些有时JVM会识别某些对象并尝试在堆栈中创建它而不是堆的地方,因为堆栈上的内存分配比堆中的内存分配便宜,堆栈上的释放是免费的,堆栈是由堆栈高效管理的运行时.那么堆栈中的这个对象分配是如何工作的,有没有办法强制JVM这样做呢?

Smi*_*_61 8

无法强制JVM在任何地方分配对象.您不应该关心Java实际分配您的Object的位置,因为它没有在规范中定义.也就是说,JVM变得更加智能,并且使用一种称为转义分析的技术 ,如果它想要,它可以在堆栈上分配一个对象.但是,无法强制JVM在特定位置分配Object,并且规范不要求发生此行为.


apa*_*gin 6

如果谈论 HotSpot JVM,它永远不会在堆栈上分配 Java 对象。但是有一个优化:当 Escape Analysis 可以证明对象引用没有逃脱正在编译的范围时,JIT 完全消除了分配并将对象字段替换为局部变量。

注意:我们不能在堆栈上声明这是一个分配,因为对象不存在,例如调用对象的方法,例如hashCodewait不可能。

每当 JVM 可以消除分配时,它就会自动消除。
如果它不能 - 没有办法强迫它。