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的位置)。
请帮助我理解这条线,或者如果我的理解存在差距
创建您的实例时java.nio.DirectByteBuffer,基本上分为两部分:
java.nio.DirectByteBuffer在堆上分配的type类型的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 调用时,该方法会调用本机字节数组的清理。