Java GC如何清除直接字节缓冲区,因为IBM Docs说了。

Ank*_*ane 4 java garbage-collection jvm nio bytebuffer

我以为,我了解Bytebuffer和DirectByteBuffer的不同之处,直到我读了IBM文档上的一篇文章,提及:

“直接ByteBuffer对象自动清除其本机缓冲区,但只能作为Java堆GC的一部分来清除”

https://www.ibm.com/developerworks/library/j-nativememory-linux/

现在我无法理解这一行,因为它说DirectByteBuffer确实作为Java堆GC的一部分进行了清理。

IFAIK,Java堆GC仅在Java堆(未分配DirectByteBuffer的区域)中进行清理。它(GC)不知道本机内存(分配DirectByteBuffer的位置)。

请帮助我理解这条线,或者如果我的理解存在差距

Nik*_*kem 5

创建您的实例时java.nio.DirectByteBuffer,基本上分为两部分:

  • 通常java.nio.DirectByteBuffer在堆上分配的type类型的java对象
  • 所需的实际字节缓冲区,由堆外的上述java对象的构造函数分配

另外,java.nio.DirectByteBufferregister 的构造函数注册一个type的runnable java.nio.DirectByteBuffer.Deallocator,这是一个私有静态类。当java.nio.DirectByteBufferGC清除此实例时,将执行此可运行命令。任务是Deallocator释放本机字节缓冲区。RTFS!:)


use*_*421 -1

它说DirectByteBuffer清理是 Java 堆 GC 的一部分。

不,没有。它说“直接ByteBuffer对象自动清理其本机缓冲区,但只能作为 Java 堆 GC 的一部分”。根本不是同一件事。

IFAIK,Java Heap GC 只在 Java 堆中进行清理

正确,但 IBM 正在谈论直接ByteBuffers进行清理,而不是 GC。

(其中DirectByteBuffer未分配)。

不存在这样的事情DirectByteBuffer。有 direct ByteBuffers,它们在堆上分配,除了它们的 direct 部分,它是一个本机字节数组

它 (GC) 不知道本机内存(分配 DirectByteBuffer 的地方)。

又错了,见上文。

这并不神秘。DirectByteBuffers可以有一个finalize()方法,当 GC 调用时,该方法会调用本机字节数组的清理。