【问题标题】:Does Hotspot JVM perform Escape Analysis during On Stack Replacement compilation?Hotspot JVM 是否在 On Stack Replacement 编译期间执行 Escape 分析?
【发布时间】:2017-12-02 09:03:00
【问题描述】:
考虑以下代码:
void methodWithOSR() {
Foo foo = new Foo(); // this object doesn't escape
for (int i = 0; i < 1_000_000; i++) {
// some code that uses `foo`
}
}
当 C2 OSR 编译开始时,Hotspot JVM 是否能够在堆栈上缩放 foo?我想这可能有问题,因为堆中已经存在一个活动对象,因此可能无法将对象从堆“移动”到堆栈和寄存器。
【问题讨论】:
标签:
java
jvm
jvm-hotspot
escape-analysis
【解决方案1】:
在这种情况下,“scalaraize”的含义还不是很清楚,但让我解释一下这个问题。
HotSpot JVM 是否在 OSR 编译期间运行 Escape Analysis?
是的。大多数编译器功能/优化对于 OSR 编译都是有效的,就像对于常规编译一样。
HotSpot 是否从逃逸分析中受益于此处Foo 实例的“标量化”(无论是什么意思)?
标量替换的主要目标是消除分配,这不适用于 Foo 实例,因为对象已经在堆中分配。
HotSpot 会将活动对象从堆移动到堆栈吗?
没有。这样做没有任何意义。堆栈只是另一个内存区域。
HotSpot 能否在此处优化对Foo 字段的访问?
是的。它可以缓存寄存器中的字段,例如this case。但是,修改仍然会写回堆中。