我读了一些有时候JVM会识别某些对象并试图在堆栈中创建它而不是堆的地方,因为堆栈上的内存分配比堆中的内存分配便宜,堆栈上的释放是免费的,堆栈是由运行时有效管理。 那么堆栈中的这个对象分配是如何工作的,有没有办法强制JVM这样做呢?
答案 0 :(得分:8)
无法强制JVM在任何地方分配对象。您不应该关心Java实际分配您的Object的位置,因为它没有在规范中定义。据说JVM已经变得更聪明并且使用了一种名为escape analysis的技术 它可以,如果它想,在堆栈上分配一个对象。但是,无法强制JVM在特定位置分配Object,并且规范不要求此行为发生。
答案 1 :(得分:4)
如果谈论HotSpot JVM,它永远不会在堆栈上分配Java对象。但是有一个优化:当Escape Analysis可以证明对象引用没有逃避正在编译的作用域时,JIT根本不需要分配,并用局部变量替换对象字段。
注意:我们不能在堆栈上声明这是一个分配,因为该对象不存在,例如无法调用像hashCode
或wait
之类的对象方法。
只要JVM可以消除分配,它就会自动完成 如果它不能 - 没有办法强迫它。