了解如果未调用release,Netty内存泄漏将如何发生

Amu*_*han 7 memory-leaks netty

我已经阅读了各种StackOverFlow QA以及有关Netty内存泄漏的外部链接和博客,从ReferenceCountedObjectsManuallyHandlingReferenceCounting,BufferOwnership,TwitterBlog,ChannelOutboundHandlerFlushedBufferLeak以及源自这些页面的其他链接开始.

我理解如果应用程序在完成资源后不释放资源,实际内存本身将被GC,但Netty的池大小仍会增加并导致内存泄漏.

上面链接解释这一点的引用引用"即使缓冲区本身是垃圾收集,用于存储池的内部数据结构也不会.","PooledByteBufAllocator也使用Recycler来"汇集"ByteBuf容器(不是它指的是自己的记忆.)"

有人可以解释一下如何发生这种情况吗?如果ByteBuf是一个引用内存的容器,那么在ByteBuf仍然在Netty内存池中时如何收集内存?我想象Netty维护了一个ByteBuf(s)池,并在它的引用计数变为0时重用它所引用的内存.通过这个假设,我无法理解如果内存本身ByteBuf仍然存在于Netty的池中,它是如何被GC 的?

有人可以用简单的语言澄清一下吗?

Nor*_*rer 5

所以让我试着在这里澄清一下……基本上 Netty 为内存本身和它周围的容器使用单独的池。

这里的容器是 ByteBuf。Netty 将 ByteBuf 池化到 Recycler(基本上是一个对象池)中。这里要注意的重要一点是,它将用于实际存储字节的实际底层内存(也称为存储)的引用“归零”。

字节本身(将通过 ByteBuf 容器公开)存在于不同的池中。这个池只保存 ByteBuf 的后备存储,而不是 ByteBuf 本身。后备存储可以是堆上(byte[])或堆外(本机/直接内存)。

所以这两个理论上都可能是内存泄漏的原因。虽然在实践中大多数内存泄漏是由于没有调用 ByteBuf.release() 导致的,这会泄漏后备内存。