【发布时间】: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,必须在编译时知道分配大小,它的引用不能分配给堆对象等。)任何资源都值得赞赏。
【问题讨论】:
-
几个月前 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