5

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

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

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

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

4

1 回答 1

6

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

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

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

释放它是您的(本机代码)责任。JVM 不知道使用什么方法来分配该后备存储(可能是 malloc 的,可能是静态缓冲区等)

如果我使用 NewDirectByteBuffer 在本机代码中创建一个新缓冲区和一个已被直接缓冲区使用的地址,会发生什么情况?

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

于 2009-08-08T08:10:24.063 回答