有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案