Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-direct缓冲区何时释放?_Java_Nio_Bytebuffer_Direct Buffer - Fatal编程技术网

Java-direct缓冲区何时释放?

Java-direct缓冲区何时释放?,java,nio,bytebuffer,direct-buffer,Java,Nio,Bytebuffer,Direct Buffer,既然它在jvm堆和gc之外,它什么时候发布?或者,它会一直保留到进程终止 我已经检查过: 但是所有的答案都是模糊的,没有一个明确的答案,有明确的答案吗?至少适用于64位Linux上的Java 8。DirectByteBuffer不使用旧的Java终结器。相反,它使用内部sun.misc.CleanerAPI。它创建新线程,并将一个PhantomReference存储到每个创建的DirectByteBuffer(除了引用主缓冲区的副本和片)。当DirectByteBuffer成为幻影可访

既然它在jvm堆和gc之外,它什么时候发布?或者,它会一直保留到进程终止

我已经检查过:


但是所有的答案都是模糊的,没有一个明确的答案,有明确的答案吗?至少适用于64位Linux上的Java 8。

DirectByteBuffer
不使用旧的Java终结器。相反,它使用内部
sun.misc.Cleaner
API。它创建新线程,并将一个
PhantomReference
存储到每个创建的
DirectByteBuffer
(除了引用主缓冲区的副本和片)。当
DirectByteBuffer
成为幻影可访问(即不再存在对字节缓冲区的强、软或弱引用)并且垃圾收集器看到这一点时,它会将此缓冲区添加到
ReferenceQueue
中,该队列由
Cleaner
线程处理。因此,应该发生三件事:

  • DirectByteBuffer
    变得可以访问幻影
  • 执行垃圾收集(在单独的线程中),
    DirectByteBuffer
    Java对象被收集,一个条目被添加到
    ReferenceQueue
  • Cleaner线程到达该条目并运行已注册的清理操作(在本例中为
    java.nio.DirectByteBuffer.Deallocator
    object),该操作最终释放本机内存
所以一般来说,你无法保证它何时被释放。如果Java堆中有足够的内存,垃圾收集器可能很长时间都不会被激活。而且,即使可以访问幻影,更干净的线程也可能需要一些时间来访问此条目。它可能正忙于处理以前也使用Cleaner API的对象。但是请注意,部分解决方法是在JDK中实现的:如果您以前创建了新的
DirectByteBuffer
,并且分配了过多的直接内存,则可能会显式调用垃圾收集器以强制取消分配以前放弃的缓冲区。有关详细信息,请参阅(从
DirectByteBuffer
constructor调用)


请注意,在Java-9中,内部的
Cleaner
API已被更正并发布,以供一般使用:现在它是。阅读JavaDoc,您可能会得到它工作的更多细节。

ByteBuffer
被垃圾收集时,终结器将执行并释放任何底层内存分配。由于您不能保证它会被释放,我建议您自己处理它,我为我的项目从JM3中剥离了类,就像,直到现在它仍然有效flawless@elect是的,有些书还说这是针对大型和长寿命缓冲区的,因此分配延迟的影响较小。对于小型和短命缓冲区,建议不要使用
直接缓冲区
,而是使用
间接缓冲区
。如果OpenGL将使用资源,则缓冲区必须是间接的。如果你通过一个间接的,jogl必须在下面创建一个直接的。所以,如果是你创造的,那就更好了,这样你就可以跟踪它了。@elect Ok,我会记住这种情况下的存在。