为什么 Netty ByterBuf.readBytes 会导致内存泄漏?
Why Netty ByterBuf.readBytes will cause memory leak?
ByteToMessageDecoder评论说:“有些方法如ByteBuf.readBytes(int)如果没有释放返回的buffer或者没有添加到out List中,会导致内存泄漏。使用像 ByteBuf.readSlice(int) 这样的派生缓冲区来避免内存泄漏。”
我有点疑惑,ByteBuf.readSlice会和parent共享refCnt和buffer,而ByteBuf.readBytes会有一个新的refCnt(初始为1)和一个新的buffer
那么,为什么我添加一个新的由ByteBuf.readBytes
创建的ByteBuf会导致内存泄漏呢?我想我可以释放在out列表中添加的新的ByteBuff,并且不会导致内存泄漏。
并且当使用ByteBuf.readSlice时,它会与parentBuffer共享refCnt,但是ByteToMessageDecoder#channelRead会释放父Buffer,我认为这会导致[=12=创建的ByteBuf ]不能再用了
readBytes(...)
将 return 分配一个新的 ByteBuf
,因此需要释放它以确保不会观察到内存泄漏。另一方面,readSlice(...)
只会“切出”指向相同内部存储的 ByteBuf
,因此与原始 ByteBuf
.
共享相同的引用计数。
所以是的,如果您释放缓冲区,它不会发生内存泄漏。
ByteToMessageDecoder评论说:“有些方法如ByteBuf.readBytes(int)如果没有释放返回的buffer或者没有添加到out List中,会导致内存泄漏。使用像 ByteBuf.readSlice(int) 这样的派生缓冲区来避免内存泄漏。”
我有点疑惑,ByteBuf.readSlice会和parent共享refCnt和buffer,而ByteBuf.readBytes会有一个新的refCnt(初始为1)和一个新的buffer
那么,为什么我添加一个新的由ByteBuf.readBytes
创建的ByteBuf会导致内存泄漏呢?我想我可以释放在out列表中添加的新的ByteBuff,并且不会导致内存泄漏。
并且当使用ByteBuf.readSlice时,它会与parentBuffer共享refCnt,但是ByteToMessageDecoder#channelRead会释放父Buffer,我认为这会导致[=12=创建的ByteBuf ]不能再用了
readBytes(...)
将 return 分配一个新的 ByteBuf
,因此需要释放它以确保不会观察到内存泄漏。另一方面,readSlice(...)
只会“切出”指向相同内部存储的 ByteBuf
,因此与原始 ByteBuf
.
所以是的,如果您释放缓冲区,它不会发生内存泄漏。