热点JVM在进行栈上替换编译期间是否执行逃逸分析?

4
考虑以下代码:
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编译启动时,热点JVM能否将foo在栈上标量化?我认为这可能会有问题,因为堆中已经存在一个活动对象,所以不可能将对象从堆移到栈和寄存器中。

1个回答

3
在这种情况下,“scalaraize”的含义不太清楚,但让我来解释一下问题的意思。
HotSpot JVM在OSR编译期间运行逃逸分析。大多数编译器功能/优化都适用于OSR编译,就像普通编译一样。
关于“标量化”,HotSpot是否从逃逸分析中受益呢?(无论它是什么意思)对于这里的Foo实例,标量替换的主要目标是消除分配,但由于对象已经在堆中分配,因此不适用。
HotSpot会将活动对象从堆移动到栈吗?不会。这样做没有任何意义,栈只是另一个内存区域。
HotSpot能够优化对这里Foo字段的访问吗?可以。例如,它可以像这个案例中那样将字段缓存在寄存器中。但是,修改仍将被写回到堆中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接