简而言之,这就是我所做的:
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 Magazine 的一篇文章中进行了讨论
要转义的数组的默认大小限制(在撰写本文时)是 64,但可以通过 -XX:EliminateAllocationArraySizeLimit=N
标志进行调整。
关于java - 逃逸分析是否有助于 JVM 在堆栈上分配数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51686170/