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

标签 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?我想这可能会有问题,因为堆中已经存在 Activity 对象,因此可能无法将对象从堆“移动”到堆栈和寄存器。

最佳答案

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

Does HotSpot JVM run Escape Analysis during OSR compilation?

是的。大多数编译器功能/优化对 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?

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

关于java - On Stack Replacement 编译时,Hotspot JVM 是否进行逃逸分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597047/

相关文章:

java - HotSpot 中的标准 JIT 编译而不是堆栈替换

Java 8 字符串重复数据删除与 String.intern()

java - 为什么这个代码片段在使用热点服务器 JVM 运行时实际上需要更长的时间?

java - 如何使用深拷贝构造函数更改最终变量?

java - 如何计算在java中执行的字节码数

java - 如何查看JVM中每个线程使用了多少资源(cpu,内存,io)

java - 为什么大多数 JVM gc 不使用引用计数?

java - 如何在 Gui 中添加图形作为按钮面板下方的面板?

java - Firebase 在每个循环后给出 null 值

java - 使用apache poi检测excel中的隐藏单元格