我有一个C库想要一个暂时的缓冲器,用于刮空间。我正在考虑通过该地址的直接字节的缓冲区。

  • 是VM曾经允许搬迁的缓冲器之前,它是最终释放了?土库将保持在指针后JNI框架进程。我的理解是,JNI当地对象引用无法可缓,因为虚拟机可能把他们重新安置期间的GC。这是否适用于缓冲地址?

  • 我了解虚拟机会免费缓冲存储器,如果我分配一个缓冲区在Java然后让我们缓冲的对象超出范围。如果我创建了一个新的缓冲地代码使用NewDirectByteBuffer,其责任是免费的背记忆?

  • 会发生什么,如果我创建一个新的缓冲地代码使用NewDirectByteBuffer和地址已经在使用的一个直接的缓冲器?将存储以双释放了?将VM参考数的记忆区块,并试图免费的时的最后一个缓冲区参考,它是垃圾收集的?

有帮助吗?

解决方案

是VM曾经允许搬迁 缓冲区之前它是最终释放了?

它不会重新定位,因为直接缓冲区不一部分的GC堆。

如果我创建了一个新的缓冲器,在本地 代码使用NewDirectByteBuffer,他的 责任是免费的 背的记忆?

这是你的(地代码)的责任,以免它。JVM不可能不知道有什么方法被用来分配后备存储(可能是malloc会,可能是一个静态的缓冲器,等等。)

会发生什么,如果我创建一个新的缓冲器 在机代码的使用 NewDirectByteBuffer和一个地址 已经在使用的一个直接的缓冲器?

鉴于VM不会试图免费存储器,其地址是传递给NewDirectByteBuffer,什么都不会发生,如果你通过同一地址的两倍。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top