Java 何时以及如何释放NIO直接缓冲区?
我有一个C库,它需要一个临时缓冲区来存储临时空间。我正在考虑将直接字节缓冲区的地址传递给它Java 何时以及如何释放NIO直接缓冲区?,java,java-native-interface,nio,Java,Java Native Interface,Nio,我有一个C库,它需要一个临时缓冲区来存储临时空间。我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前,是否允许VM重新定位缓冲区? JNI框架消失后,本机库将保留指针。我的理解是,不能缓存JNI本地对象引用,因为VM可能在GC期间重新定位它们。这是否适用于缓冲区地址 我知道,如果我在Java中分配缓冲区,然后让缓冲区对象超出范围,VM将释放缓冲区内存。如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,谁负责释放备份内存 如果我使用NewDirectBy
- 在最终释放缓冲区之前,是否允许VM重新定位缓冲区? JNI框架消失后,本机库将保留指针。我的理解是,不能缓存JNI本地对象引用,因为VM可能在GC期间重新定位它们。这是否适用于缓冲区地址
- 我知道,如果我在Java中分配缓冲区,然后让缓冲区对象超出范围,VM将释放缓冲区内存。如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,谁负责释放备份内存
- 如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,并且直接缓冲区已经在使用一个地址,会发生什么?内存会被双重释放吗?当引用它的最后一个缓冲区被垃圾回收时,VM引用会对内存块计数并尝试释放它吗
假设VM不会尝试释放其地址传递给NewDirectByteBuffer的内存,如果您两次传递同一地址,将不会发生任何事情。我找不到任何官方Java文档说明本机代码负责释放缓冲区。@Raedwald我建议您阅读此文档:由垃圾收集器管理Java堆,但由您管理本机堆。