Netty之ByteBuf的创建和释放

ByteBuf的创建时机

OP_READ事件产生后,IO线程会在AbstractNioByteChannel.NioByteUnsafe.read() 处调用ByteBufAllocator创建ByteBuf,将TCP缓冲区的数据读取到Bytebuf中,并调用 pipeline.fireChannelRead(byteBuf) 进入Handler处理链。

ByteBuf的释放原则

由最后使用ByteBuf的Handler负责释放。

ByteBuf的释放

1. InBound

每个Handler对ByteBuf的处理有以下三种方式:
- 对原消息不做处理,调用 ctx.fireChannelRead(msg)把原消息往下传,此时不做释放;
- 将原消息转化为新的消息并调用 ctx.fireChannelRead(newMsg)往下传,那必须把原消息release掉;
- 如果已经不再调用ctx.fireChannelRead(msg)传递任何消息,那更要把原消息release掉;

说明: Netty的ChannelPipleline的末端有TailHandler,如果每个Handler都把消息往下传,TailHandler会释放掉ReferenceCounted类型的消息。 如果我们的业务Hanlder不再把消息往下传了,这个TailHandler就派不上用场。

2. OutBound

要发送的消息通常由应用所创建,并调用 ctx.writeAndFlush(msg) 进入Handler链。在每一个Handler中的处理类似InBound Message,最后消息会来到HeadHandler,再经过一轮复杂的调用,在flush完成后终将被release掉。

3. Exception

多层的异常处理机制,有些异常处理的地方不一定准确知道ByteBuf之前释放了没有,可以在释放前加上引用计数大于0的判断避免异常; 有时候不清楚ByteBuf被引用了多少次,但又必须在此进行彻底的释放,可以循环调用reelase()直到返回true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值