JAVA 9 及更高版本中的转义分析和堆栈分配优化改进

Escape Analysis and stack allocation optimization improvements in JAVA 9 and beyond

提问人:digital_infinity 提问时间:9/26/2019 最后编辑:digital_infinity 更新时间:10/25/2019 访问量:868

问:

HotSpot Java 9-13 的堆栈分配优化规则是否不那么严格?

在 Java 7 和 Java 8 中,对象的 HotSpot 堆栈分配(由于 JVM 优化,称为标量对象替换)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足许多严格的约束。

为 Java 8(HotSpot、OpenJDK 8)启用堆栈分配优化的规则总结在对这个问题的精彩回答中: Hotspot 何时可以在堆栈上分配对象? 至于 Java 7,这里: 使用 Java 7 进行转义分析/堆栈分配的资格

在这个问题中,我想了解较新的JDK版本中EA和堆栈分配优化的当前状态如何?其他 Java VM(例如OpenJ9)有不同的规则吗?

Java JVM 编译器优化 转义分析 堆栈分配

评论

3赞 Holger 9/26/2019
从链接的答案中可以看出:“要知道的另一件重要事情是,Hotspot实际上并没有实现对象的堆栈分配。相反,它实现了标量替换,...”术语“堆栈分配”在这种优化的实际目的方面具有误导性。因此,在最近的 JVM 中没有重大变化,仅仅是因为将对象放在堆栈上从来都不是目标。
0赞 digital_infinity 9/26/2019
@Holger是的,我知道它是一种 JVM 优化技术,而不是语言内置功能。也许当 Java 中引入 ValueTypes 时,我们将有可能在堆栈上分配复杂类型。阅读您的评论后,我在问题标题中添加了明确的“优化”一词。
1赞 Holger 9/26/2019
那不是我的重点。Hotspot 进行标量替换,允许将临时对象的字段视为局部变量,从而实现后续优化,如常量折叠、部分冗余消除、强度降低、死码消除、寄存器分配等。因此,如果字段值既未消除也未分配给寄存器,则最终可能会出现在堆栈中,但这不是主要目标。因此,标量替换不适用于更广泛的场景,因为只有那些允许后续代码优化的场景才真正重要。
0赞 digital_infinity 9/27/2019
但是,如果临时对象嵌套了另一个对象(即使它也是临时的),则标量替换在 HotSpot JVM 8 中不起作用。这在链接问题中的限制之一中有所说明。
1赞 Eugene 9/30/2019
当然,@digital_infinity您可以尝试在 VM 上使用一些标志并查看输出。但是发生这种情况的 C2 是非常“旧”的编译器,我怀疑已经发生了很大变化......更有趣的部分是尝试对抗 Graal 的 C2。

答: 暂无答案