Netty - 是不是需要释放 Unpooled.unreleasesableBuffer 的内存

Posted

技术标签:

【中文标题】Netty - 是不是需要释放 Unpooled.unreleasesableBuffer 的内存【英文标题】:Netty - Is there a need to free memory of Unpooled.unreleasableBufferNetty - 是否需要释放 Unpooled.unreleasesableBuffer 的内存 【发布时间】:2018-07-19 02:53:43 【问题描述】:

说,我们在 MyClass 中声明:

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

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

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

【问题讨论】:

【参考方案1】:

(仅限 JVM)如果在堆 GC 期间默认情况下在 JVM 中没有对直接缓冲区的引用但不受堆压力影响,那么似乎将清理直接缓冲区,因此根据之前的堆栈溢出问题可能需要手动清理. Stack Overflow 1, Stack Overflow 2

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

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

【讨论】:

以上是关于Netty - 是不是需要释放 Unpooled.unreleasesableBuffer 的内存的主要内容,如果未能解决你的问题,请参考以下文章

8.基于netty实现群聊,心跳检测

Netty 通过一个渠道写几条消息

Netty源码_UnpooledDirectByteBuf详解

Netty源码_UnpooledHeapByteBuf详解

在 Netty 4.0 中创建一个 ByteBuf

Netty源码分析-MessageToByteEncoder