为啥 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 4 没有 Datagram ServerChannel