我已经阅读了各种与Netty中的内存泄漏相关的StackOverFlow QAs、外部链接和博客,从ReferenceCountedObjects和ManuallyHandlingReferenceCounting、BufferOwnership、TwitterBlog、ChannelOutboundHandlerFlushedBufferLeak等链接开始。
我明白,如果应用程序在使用完资源后不释放它,则实际内存本身将被GC,但仍然会增加Netty的池大小并导致内存泄漏。
以上链接中的一些引用解释了这一点:“即使缓冲区本身被垃圾收集,用于存储池的内部数据结构也不会被回收。”,“PooledByteBufAllocator也使用Recycler来“池化”ByteBuf容器(而不是它所指向的内存)。”
请问有人能更详细地解释一下这是如何发生的吗?如果ByteBuf
是一个容器,它引用了一个内存,那么当ByteBuf
仍然存在于Netty内存池中时,内存如何被回收?我想象Netty维护了一个ByteBuf
的池,并在其引用计数变为0时重用它所引用的内存。基于这个假设,我无法理解如果ByteBuf
仍然存在于Netty的池中,内存本身如何被GC。
请有人以简单的方式澄清一下吗?