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不能不用了。
答案 0 :(得分:1)
readBytes(...)
将返回一个新的 ByteBuf
,它已分配,因此需要释放以确保不会观察到内存泄漏。另一方面,readSlice(...)
只会“切出”一个指向相同内部存储的 ByteBuf
,因此与原始 ByteBuf
共享相同的引用计数。
所以是的,如果您释放缓冲区,则不会发生内存泄漏。