比如说,我们在 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/