java如果JVM被允许在垃圾收集期间移动堆内存,那么垃圾收集如何不会因为移动指针而导致JNI爆炸?
使用ByteBuffer就是一个例子;将数据从and数组或HeapByteBuffer复制到DirectByteBuffer会执行JNI调用
基本上这
public static void copyFromByteArray(byte[] src, long srcPos, long dstAddr, long length)
{
long offset = arrayBaseOffset + srcPos;
while (length > 0)
{
long size = (length > UNSAFE_COPY_THRESHOLD) ? UNSAFE_COPY_THRESHOLD : length;
unsafe.copyMemory(src, offset, null, dstAddr, size);
length -= size;
offset += size;
dstAddr += size;
}
}
它使用了计算堆指针和直接从堆复制的魔力。如果这个指针在这个例程的中间变得无效,这怎么可能是远程安全的?
对于相关人员:不安全的拷贝阈值为1GB
编辑:谢谢回复。我为任何想要回答同一问题的人添加以下参考资料。这个过程利用了safepoints(我不知道他们叫它什么,所以我不能用谷歌搜索它)
参考资料:
共 (0) 个答案