逃逸分析是否有助于JVM在堆栈上分配数组?

3
简单来说,我的工作是:
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,在编译时必须知道分配大小,它的引用不能被分配给堆对象等)。感谢任何资源。


可能是Java中的逃逸分析的重复问题。 - luketorjussen
@luketorjussen 我很惊讶默认的EA限制数组大小为64。我以前从未测试过小于128的数组,因此没有看到任何性能差异。现在我使用XX:EliminateAllocationArraySizeLimit为64+数组分配堆栈内存。如果您将其发布为答案,我可以接受它。谢谢。 - vkx
很高兴这有所帮助。我已将其添加为答案。 - luketorjussen
1个回答

3

这在Java Magazine的一篇文章中有讨论。

目前默认的数组转义大小限制为64,但可以通过-XX:EliminateAllocationArraySizeLimit=N标志进行调整。


非常有趣的了解它。感谢提供信息。其他与逃逸分析相关的选项如何? - St.Antario
1
推荐在这里搜索以消除或避免问题 - https://chriswhocodes.com/hotspot_options_jdk8.html - luketorjussen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接