java - Java GC 如何清理直接字节缓冲区,因为 IBM 文档说,确实如此。

标签 java garbage-collection jvm nio bytebuffer

我假设,我了解 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/

相关文章:

java - 如何使用 Java 而不是使用 XML 来更改此自定义进度条的颜色?

c - 为什么在 openmp 并行 block 中使用的东西之后不会被 Boehm GC 收集?

C++ 到 CLR 的字节码编译器?

java - JVM 如何终止守护线程?或如何编写优雅终止的守护线程

java - JVM 版本管理器

java - 找出 Java 中的焦点应用程序(窗口)

java - slider 求解器空指针异常

java - Docker Swarm 上的 Consul 与 Spring Boot 客户端

java - Java 中的清除 protected 双向链表

Java 类实例不会被销毁