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 的内存的主要内容,如果未能解决你的问题,请参考以下文章