说,我们在MyClass中声明:
ByteBuf fixedBuf = Unpooled.unreleasableBuffer(
PooledByteBufAllocator.DEFAULT.directBuffer(64, 64));
这应该保留一个64字节的堆外内存块。如所记录的,Netty在这里忽略了“ release()”和“ retain()”功能,因此,在MyClass的整个生命周期中,块始终保持分配状态。一旦MyClass实例超出范围,分配的堆外内存块将如何处理? JVM / GC会发布它吗?如果不是,或者如果我想以编程方式丢弃'fixedBuf',那么如何最好地为此类ByteBuf对象重新分配要求保护的内存块?
您是否还请参考说明/示例/最佳实践,以避免任何内存泄漏和ByteBuf对象上的问题?
答案 0 :(得分:0)
(仅JVM)如果在堆GC期间JVM中默认情况下没有对直接缓冲区的引用,但似乎不受堆压力的影响,则似乎将清除直接缓冲区,因此根据先前的堆栈溢出问题,可能需要手动清理。 Stack Overflow 1,Stack Overflow 2
(对于Netty)由于Netty引用了直接缓冲区,所以我认为在PoolThreadCache运行方法free()之前它不会清理它,该方法手动使用{{1}的finalize块中发生的Netty Internal/Cleaners }}和其他位置。如果您超出范围,则PoolThreadCache.java
使用free时它将自动清除;但是我没有追踪到何时发生。如有疑问,请使用PoolThreadCache.java
并自行释放。
一些工作说明发布在此处netty / netty / issues / 8139,其中显示了使用其源代码查找答案的步骤。 Is there a need to free memory of Unpooled.unreleasableBuffer #8139