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`
    }
}

foo当 C2 OSR 编译开始时,Hotspot JVM 是否能够在堆栈上进行标量化?我想这可能是有问题的,因为堆中已经存在一个活动对象,因此可能无法将对象从堆“移动”到堆栈和寄存器。

4

1 回答 1

3

在这种情况下,“scalaraize”的含义还不是很清楚,但让我解释一下这个问题。

HotSpot JVM 在 OSR 编译期间是否运行 Escape Analysis?

是的。大多数编译器功能/优化对于 OSR 编译都是有效的,就像对于常规编译一样。

HotSpot 是否受益于 Escape Analysis 关于Foo此处实例的“标量化”(无论它是什么意思)?

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

HotSpot 会将活动对象从堆移动到堆栈吗?

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

HotSpot 可以优化对Foo此处字段的访问吗?

是的。例如,它可能会在寄存器中缓存字段,就像在这种情况下一样。但是,修改仍将写回堆。

于 2017-12-02T00:50:23.063 回答