On Stack Replacement 编译时,Hotspot JVM 是否进行逃逸分析?

Does Hotspot JVM perform Escape Analysis during On Stack Replacement compilation?

考虑以下代码:

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?我想这可能有问题,因为堆中已经存在活动对象,因此可能无法 "move" 从堆到堆栈和寄存器的对象。

不太清楚 "scalaraize" 在这种情况下是什么意思,但让我解释一下这个问题。

Does HotSpot JVM run Escape Analysis during OSR compilation?

是的。大多数编译器 features/optimizations 对 OSR 编译有效,就像对常规编译一样。

Does HotSpot benefit from Escape Analysis with respect to "scalarization" (whatever it mean) of Foo instance here?

标量替换的主要目标是分配消除,这不适用于 Foo 实例,因为该对象已经在堆中分配。

Will HotSpot move live object from heap to stack?

没有。这样做没有意义。堆栈只是另一个内存区域。

Can HotSpot optimize access to Foo fields here?

是的。它可以在寄存器中缓存字段,例如 。但是,修改仍然会写回到堆中。