ByteToMessageDecoder评论说:“如果返回的缓冲区没有被释放或添加到out列表中,ByteBuf.readBytes(int)等一些方法将导致内存泄漏。使用像ByteBuf.readSlice(int)这样的派生缓冲区来避免内存泄漏。“
我有点困惑,ByteBuf.readSlice将与父级共享refCnt和buffer,而ByteBuf.readBytes将有一个新的refCnt (初始为1)和一个新的buffer。
那么,为什么添加ByteBuf.readBytes创建的新ByteBuf会导致内存泄漏呢?我想我可以释放添加到out列表中的新ByteBuff,并且不会导致内存泄漏。
当使用ByteBuf.readSlice时,它会与parentBuffer共享refCnt,但ByteToMessageDecoder#channelRead会重新释放父缓冲区,我认为这会导致readSlice创建的ByteBuf无法再使用。

发布于 2021-07-14 02:58:35
readBytes(...)将返回一个已分配的新ByteBuf,因此需要释放该and以确保不会观察到内存泄漏。另一方面,readSlice(...)只是将指向相同内部存储的ByteBuf“切片”出来,因此与原始ByteBuf共享相同的引用计数。
所以,是的,如果您释放缓冲区,它将不会发生内存泄漏。
https://stackoverflow.com/questions/68264452
复制相似问题