您的位置:首页 > 其它

Netty之ByteBuf的创建和释放

2017-09-06 16:34 197 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: