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。相关文章推荐
- Netty笔记--ByteBuf释放
- Netty中ByteBuf对象的创建方式对内存的影响
- Netty ByteBuf 释放注意事项
- Netty in Action (十四) 第五章节 第三部分 ByteBufHolder,ByteBuf分配,计数引用
- Netty的ByteBuf介绍
- Netty bytebuf 源码解析
- netty学习之二:ByteBuf解读
- Netty入门(四)ByteBuf 字节级别的操作
- netty5源码探索(一)----ByteBuf初探
- Netty 权威指南笔记(五):ByteBuf 源码解读
- netty中ByteBuf部分的分析
- 一起学Netty(五)之 初识ByteBuf和ByteBuf的常用API
- netty源码分析(二十一)Netty数据容器ByteBuf底层数据结构深度剖析与ReferenceCounted初探
- netty(十一)源码分析之ByteBuf 三
- 对于 Netty ByteBuf 的零拷贝(Zero Copy)的理解
- Netty - ByteBuf (2)
- Netty源码分析:AbstractByteBuf
- netty, ByteBuf 转 String
- Netty - ByteBuf (3)
- 【Netty4.X】Netty源码分析之ByteBuf(七)