【问题标题】:Does escape analysis help JVM to allocate arrays on stack?逃逸分析是否有助于 JVM 在堆栈上分配数组?
【发布时间】:2019-01-12 03:31:15
【问题描述】:

简而言之,这就是我所做的:

public void method(List<Integer> elems) {
    final int MAX_ELEM_COUNT = 32;
    ByteBuffer bb == ByteBuffer.allocate(MAX_ELEM_COUNT * Integer.BYTES);

    for (Integer elem : elems) {
         bb.putInt(elem);
    }

    bb.flip();

    ByteBuffer dest = getPermanentBufferForSize(bb.remaining());
    dest.put(bb);
}

临时缓冲区非常小(128 字节),它没有转义,所以看起来很适合堆栈分配。 (ByteBuffer 对象本身和它引用的字节数组)。

JVM(尤其是 OpenJDK)是否曾经为数组这样做过?

如果他们这样做,触发这种逃逸分析的要求是什么? (我正在寻找 JVM 的实现细节,例如:它必须小于 4 kb,必须在编译时知道分配大小,它的引用不能分配给堆对象等。)任何资源都值得赞赏。

【问题讨论】:

  • Escape analysis in Java的可能重复
  • 几个月前 Java 杂志有一篇关于 Escape 分析的文章 javamagazine.mozaicreader.com/MarApr2018/Default/73/0/…,然后还有一篇关于锁省略的文章(也研究了 EA 和数组) - javamagazine.mozaicreader.com/MayJune2018/Default/74/0/… 你可能需要订阅阅读它们,但这样做是免费的。
  • @luketorjussen 我很惊讶数组的默认 EA 限制为 64。我从来没有测试过少于 128 的,所以我没有看到任何性能差异。现在,我使用 XX:EliminateAllocationArraySizeLimit 获得了 64 个以上数组的堆栈分配数组。如果您将其发布为答案,我可以接受。谢谢。
  • 很高兴这有帮助。我已将其添加为答案

标签: java performance optimization jvm jit


【解决方案1】:

Java Magazine 的一篇文章中对此进行了讨论

要转义的数组的默认大小限制(在撰写本文时)为 64,但可以通过 -XX:EliminateAllocationArraySizeLimit=N 标志进行调整。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2015-06-10
相关资源
最近更新 更多