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

Java 何时以及如何释放NIO直接缓冲区?,java,java-native-interface,nio,Java,Java Native Interface,Nio,我有一个C库,它需要一个临时缓冲区来存储临时空间。我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前,是否允许VM重新定位缓冲区? JNI框架消失后,本机库将保留指针。我的理解是,不能缓存JNI本地对象引用,因为VM可能在GC期间重新定位它们。这是否适用于缓冲区地址 我知道,如果我在Java中分配缓冲区,然后让缓冲区对象超出范围,VM将释放缓冲区内存。如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,谁负责释放备份内存 如果我使用NewDirectBy

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

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

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

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

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

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

如果我在本机中创建一个新缓冲区 使用NewDirectByteBuffer的代码,其 解放人民的责任是什么 备份内存

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

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


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

我找不到任何官方Java文档说明本机代码负责释放缓冲区。@Raedwald我建议您阅读此文档:由垃圾收集器管理Java堆,但由您管理本机堆。