何时以及如何释放NIO直接缓冲区?

我有一个C库,需要一个临时缓冲区用于临时空间。 我正在考虑将直接字节缓冲区的地址传递给它。

  • 是否允许VM在最终释放缓冲区之前重新定位缓冲区? 在JNI帧消失后,本机库将保持指针。 我的理解是无法缓存JNI本地对象引用,因为VM可能在GC期间重定位它们。 这适用于缓冲区地址吗?

  • 据我所知,如果我在Java中分配缓冲区然后让缓冲区对象超出范围,VM将释放缓冲区内存。 如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存?

  • 如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么? 记忆会被双重释放吗? VM引用是否会计算内存块,并在引用它的最后一个缓冲区被垃圾收集时尝试释放它?

是否允许VM在最终释放缓冲区之前重新定位缓冲区?

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

如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存?

释放它是你(本机代码)的责任。 JVM无法知道用于分配该后备存储的方法(可以是malloc,可以是静态缓冲区等)

如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么?

鉴于VM不会尝试释放其地址传递给NewDirectByteBuffer的内存,如果两次传递相同的地址,则不会发生任何事情。