java - Netty - 是否需要释放 Unpooled.unreleasableBuffer 的内存

标签 java netty

比如说,我们在 MyClass 中声明:

ByteBuf fixedBuf = Unpooled.unreleasableBuffer(
                       PooledByteBufAllocator.DEFAULT.directBuffer(64, 64));

这应该保留 64 字节的堆外内存块。如文档所述,Netty 在这里忽略了“release()”和“retain()”功能,因此, block 在 MyClass 的整个生命周期中保持分配状态。一旦 MyClass 的实例超出范围,分配的堆外内存块会发生什么? JVM/GC会释放它吗?如果不是,或者如果我想以编程方式丢弃“fixedBuf”,我怎样才能最好地为此类 ByteBuf 对象解除分配所声明的内存块?

您能否指出避免 ByteBuf 对象上的任何内存泄漏和问题的解释/示例/最佳实践?

最佳答案

(仅限 JVM)看来,如果在堆 GC 期间 JVM 中默认没有对直接缓冲区的引用,则直接缓冲区将被清理,但不受堆压力的影响,因此可能需要根据之前的堆栈溢出问题进行手动清理。 Stack Overflow 1 , Stack Overflow 2

(对于 Netty)由于 Netty 引用了直接缓冲区,我认为它不会清理它,直到 PoolThreadCache 运行方法 free() 手动使用 Netty Internal/Cleaners这发生在 PoolThreadCache.java 的 Finalize block 和其他位置。如果超出范围,当 PoolThreadCache.java 使用 free 时,它​​应该自动清理;但我还没有追踪到这种情况何时发生。如果有疑问,请使用 Unpooled.unwrap() 并自行释放它。

一些工作笔记发布在 netty/netty/issues/8139 上,其中我展示了使用源代码查找答案的步骤。 Is there a need to free memory of Unpooled.unreleasableBuffer #8139

关于java - Netty - 是否需要释放 Unpooled.unreleasableBuffer 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413656/

相关文章:

java - 向 JButton 的位置添加值

java - 解析文件并按属性对行进行排序

java - Apache Camel XmlJsonDataFormat XML 到 JSON

java - 为什么 cURL 不将 cookie 的过期/最大年龄值发送回服务器?

java - Netty 和多个处理程序

Java GUI 不会显示 JLabel

java - 当我尝试无休止地更新 JTextField 时,为什么我的程序会卡住?

java - Netty 分块输入流

java - netty 中的异常 io.netty.util.concurrent.BlockingOperationException :

java - 如何为 http 代理配置 netty 管道