考虑以下代码:
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 OSR编译启动时,Hotspot JVM能够在堆栈上扩展C2吗?我认为这可能是个问题,因为堆中已经存在一个活动对象,因此不可能将对象从堆“移动”到堆栈和寄存器。
发布于 2017-12-02 00:50:23
目前还不清楚“标量化”在这种情况下意味着什么,但让我解释一下这个问题。
HotSpot JVM在OSR编译期间是否运行逃逸分析?
是。大多数编译器特性/优化对于OSR编译都是有效的,就像对常规编译一样。
HotSpot在
Foo实例的“标度化”方面是否受益于逃逸分析?
标量替换的主要目标是消除分配,这不适用于Foo实例,因为对象已经在堆中分配。
HotSpot会将活动对象从堆移到堆栈吗?
不是的。这样做是没有意义的。堆栈只是另一个内存区域。
HotSpot可以优化对
Foo字段的访问吗?
是。它可以在寄存器中缓存字段,例如,在this case中。但是,修改仍将写入堆中。
https://stackoverflow.com/questions/47597047
复制相似问题