请考虑以下代码:
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;从堆到堆栈和寄存器的对象。
答案 0 :(得分:3)
在这种情况下,“scalaraize”意味着什么并不十分清楚,但让我解释一下这个问题。
HotSpot JVM在OSR编译期间是否运行Escape Analysis?
是。大多数编译器功能/优化对于OSR编译都是有效的,就像常规编译一样。
对于
Foo
实例的“scalarization”(无论是什么意思),HotSpot是否会从Escape Analysis中受益?
标量替换的主要目标是分配消除,这不适用于Foo实例,因为该对象已经在堆中分配。
HotSpot会将活动对象从堆移动到堆栈吗?
没有。这样做没有意义。堆栈只是另一个内存区域。
HotSpot可以优化对
Foo
字段的访问吗?
是。它可以缓存寄存器中的字段,例如,在this case中。但是,修改仍将写回堆中。