【问题标题】:Does Hotspot JVM perform Escape Analysis during On Stack Replacement compilation?Hotspot JVM 是否在 On Stack Replacement 编译期间执行 Escape 分析?
【发布时间】:2017-12-02 09:03:00
【问题描述】:

考虑以下代码:

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

【问题讨论】:

    标签: java jvm jvm-hotspot escape-analysis


    【解决方案1】:

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

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

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

    HotSpot 是否从逃逸分析中受益于此处Foo 实例的“标量化”(无论是什么意思)?

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

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

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

    HotSpot 能否在此处优化对Foo 字段的访问?

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

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多