为啥 Netty ByteBuf.readBytes 会导致内存泄漏?

Posted

技术标签:

【中文标题】为啥 Netty ByteBuf.readBytes 会导致内存泄漏?【英文标题】:Why Netty ByterBuf.readBytes will cause memory leak?为什么 Netty ByteBuf.readBytes 会导致内存泄漏? 【发布时间】:2021-07-06 04:13:35 【问题描述】:

ByteToMessageDecoder 评论说:“有些方法如 ByteBuf.readBytes(int) 如果返回的缓冲区没有释放或添加到 out List 中会导致内存泄漏。使用像 ByteBuf.readSlice(int) 这样的派生缓冲区来避免内存泄漏。”

我有点困惑,ByteBuf.readSlice 会和父级共享 refCnt 和缓冲区,而 ByteBuf.readBytes 会有一个新的 refCnt (初始值为 1)和一个新的缓冲区。

那么,为什么我在添加ByteBuf.readBytes创建的新ByteBuf时会导致内存泄漏?我想我可以释放添加到 out 列表中的新 ByteBuff,并且不会导致内存泄漏。

并且当使用ByteBuf.readSlice时,它会与parentBuffer共享refCnt,但是ByteToMessageDecoder#channelRead会释放父Buffer,我认为这会导致readSlice创建的ByteBuf不能被任何使用更多。

【问题讨论】:

【参考方案1】:

readBytes(...) 将返回一个新的ByteBuf,该ByteBuf 已分配,因此需要释放以确保不会观察到内存泄漏。另一方面,readSlice(...) 只会“切片”出指向相同内部存储的ByteBuf,因此与原始ByteBuf 共享相同的引用计数。

所以是的,如果你释放缓冲区,它不会发生内存泄漏。

【讨论】:

以上是关于为啥 Netty ByteBuf.readBytes 会导致内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

Netty:Netty为啥去掉支持AIO?

为啥 Netty 4 没有 Datagram ServerChannel

netty4在channel.writeAndFlush为啥还阻塞延迟

为啥我们真的需要多个 netty boss 线程?

为啥 Netty 从 UDP 消息中只给我 768 个字节

Netty 5.0为啥被舍弃?原因竟然是...