Java-direct缓冲区何时释放?
既然它在jvm堆和gc之外,它什么时候发布?或者,它会一直保留到进程终止 我已经检查过: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成为幻影可访
但是所有的答案都是模糊的,没有一个明确的答案,有明确的答案吗?至少适用于64位Linux上的Java 8。
DirectByteBuffer
不使用旧的Java终结器。相反,它使用内部sun.misc.Cleaner
API。它创建新线程,并将一个PhantomReference
存储到每个创建的DirectByteBuffer
(除了引用主缓冲区的副本和片)。当DirectByteBuffer
成为幻影可访问(即不再存在对字节缓冲区的强、软或弱引用)并且垃圾收集器看到这一点时,它会将此缓冲区添加到ReferenceQueue
中,该队列由Cleaner
线程处理。因此,应该发生三件事:
变得可以访问幻影DirectByteBuffer
- 执行垃圾收集(在单独的线程中),
Java对象被收集,一个条目被添加到DirectByteBuffer
ReferenceQueue
- Cleaner线程到达该条目并运行已注册的清理操作(在本例中为
object),该操作最终释放本机内存java.nio.DirectByteBuffer.Deallocator
DirectByteBuffer
,并且分配了过多的直接内存,则可能会显式调用垃圾收集器以强制取消分配以前放弃的缓冲区。有关详细信息,请参阅(从DirectByteBuffer
constructor调用)
请注意,在Java-9中,内部的
Cleaner
API已被更正并发布,以供一般使用:现在它是。阅读JavaDoc,您可能会得到它工作的更多细节。当ByteBuffer
被垃圾收集时,终结器将执行并释放任何底层内存分配。由于您不能保证它会被释放,我建议您自己处理它,我为我的项目从JM3中剥离了类,就像,直到现在它仍然有效flawless@elect是的,有些书还说这是针对大型和长寿命缓冲区的,因此分配延迟的影响较小。对于小型和短命缓冲区,建议不要使用直接缓冲区
,而是使用间接缓冲区
。如果OpenGL将使用资源,则缓冲区必须是间接的。如果你通过一个间接的,jogl必须在下面创建一个直接的。所以,如果是你创造的,那就更好了,这样你就可以跟踪它了。@elect Ok,我会记住这种情况下的存在。