我有一个C库,需要临时缓冲区用于临时空间。我正在考虑将直接字节缓冲区的地址传递给它。
是否允许VM在最终释放缓冲区之前重新定位缓冲区? 在JNI帧消失后,本机库将保持指针。我的理解是无法缓存JNI本地对象引用,因为VM可能在GC期间重定位它们。这是否适用于缓冲区地址?
据我所知,如果我在Java中分配缓冲区然后让缓冲区对象超出范围,VM将释放缓冲区内存。如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存?
如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么?记忆会被双重释放吗? VM引用是否会计算内存块,并在引用它的最后一个缓冲区被垃圾收集时尝试释放它?
答案 0 :(得分:6)
是否允许VM重新定位 缓冲区最终被释放?
它不会重定位它,因为直接缓冲区不是GC堆的一部分。
如果我在native中创建一个新缓冲区 使用NewDirectByteBuffer的代码 责任是解放 支持记忆?
释放它是你(本机代码)的责任。 JVM无法知道用于分配该后备存储的方法(可以是malloc,可以是静态缓冲区等)。
如果我创建一个新缓冲区会发生什么 在本机代码中使用 NewDirectByteBuffer和一个地址 已被直接缓冲区使用?
鉴于VM不会尝试释放其地址传递给NewDirectByteBuffer的内存,如果您两次传递相同的地址,则不会发生任何事情。