我假设,我了解 Bytebuffer 和 DirectByteBuffer 的不同之处,直到我阅读了一篇关于 IBM 文档的文章,提到:
“Direct ByteBuffer 对象会自动清理其 native 缓冲区,但只能作为 Java 堆 GC 的一部分这样做”
https://www.ibm.com/developerworks/library/j-nativememory-linux/
现在我无法理解这一行,因为它说 DirectByteBuffer 将清理作为 Java 堆 GC 的一部分。
IFAIK,Java 堆 GC 仅在 Java 堆中进行清理(未分配 DirectByteBuffer 的地方)。 它 (GC) 不知道 native 内存(分配 DirectByteBuffer 的地方)。
请帮助我理解这一行,或者我的理解是否有差距
最佳答案
当您创建 java.nio.DirectByteBuffer
的实例时,您基本上有 2 个部分:
java.nio.DirectByteBuffer
类型的普通 java 对象,分配在堆上- 您想要的实际字节缓冲区,由上述 java 对象的构造函数在堆外分配
此外,java.nio.DirectByteBuffer
的构造函数注册了一个java.nio.DirectByteBuffer.Deallocator
类型的runnable,它是一个私有(private)静态类。当 GC 清理此 java.nio.DirectByteBuffer
实例时执行此 runnable。释放 native 字节缓冲区是此 Deallocator
的任务。实时文件系统! :)
关于java - Java GC 如何清理直接字节缓冲区,因为 IBM 文档说,确实如此。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40122063/