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

时间:2021-07-06 04:13:35

标签: memory-leaks netty bytebuffer

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

有点迷糊,ByteBuf.readSlice会和父级共享refCnt和buffer,而ByteBuf.readBytes会有一个新的refCnt(初始为1)和一个新的buffer。

那么,为什么当我添加一个由ByteBuf.readBytes创建的新ByteBuf时会导致内存泄漏?我想我可以释放添加在out list中的新ByteBuff,不会造成内存泄漏。

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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