逃逸分析是否有助于 JVM 在堆栈上分配数组?
Does escape analysis help JVM to allocate arrays on stack?
简而言之,这就是我所做的:
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,分配大小必须在编译时已知,它的引用不能分配给堆对象等。)任何资源都值得赞赏。
的一篇文章对此进行了讨论
要转义的数组的默认大小限制(在撰写本文时)是 64,但可以通过 -XX:EliminateAllocationArraySizeLimit=N
标志进行调整。
简而言之,这就是我所做的:
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,分配大小必须在编译时已知,它的引用不能分配给堆对象等。)任何资源都值得赞赏。
要转义的数组的默认大小限制(在撰写本文时)是 64,但可以通过 -XX:EliminateAllocationArraySizeLimit=N
标志进行调整。