有一个关于 Netty 下游缓冲区发送流的缓冲区管理的问题。
我有一个 Netty SimpleChannelInBoundHandler MainHandler 可以做两件事:-
作为第 1 部分,我相信我需要显式保留缓冲区以将其向下游发送到目标通道 D。我是否还需要在该通道的 writeAndFlush() 之后释放此缓冲区?或者 Netty 管道会负责发布它吗?
基于 Netty 文档 https://netty.io/wiki/new-and-noteworthy-in-4.0.html,它说
When an outbound (a.k.a. downstream) message reaches at the beginning of the pipeline, Netty will release it after writing it out.
这让我认为 Netty 会在之后释放显式保留的缓冲区下游/目的地通道管道完成。这种理解正确吗?
`
显式释放缓冲区会在下游管道中抛出 ReferenceCountUtilException
每次调用
WriteAndFlush
时,bytebuf的引用计数refCnt
都会被设置为0,从而释放它。
但当有多个客户端连接时,并不能保证在所有消息发送完毕之前byteBuff不被释放,需要手动添加byteBuff.retain()
,使引用计数增加1。
可以在try-finally中添加
.release()
int count = byteBuf.refCnt();
if(count0!=0){
byteBuf.release();
}