Hotspot JVM是否在堆栈替换编译期间执行转义分析?

时间:2017-12-01 15:58:55

标签: java jvm jvm-hotspot escape-analysis

请考虑以下代码:

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?我认为它可能有问题,因为活动对象已经存在于堆中,因此可能无法移动&#34;从堆到堆栈和寄存器的对象。

1 个答案:

答案 0 :(得分:3)

在这种情况下,“scalaraize”意味着什么并不十分清楚,但让我解释一下这个问题。

  

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

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

  

对于Foo实例的“scalarization”(无论是什么意思),HotSpot是否会从Escape Analysis中受益?

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

  

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

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

  

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

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