首先我们来明确一下Buffer(缓存)
JavaNIO中的Buffer、Netty中的Buffer、Netty中的Bytebuf这是3个不同的类,但实现的内容和完成的功能几乎一致,最原始的是JavaNIO中的Buffer实现,最先进的是Netty中Bytebuf的实现,下面我们来看Bytebuf类
Netty中的Buffer讲解
http://t.zoukankan.com/TomSnail-p-6218163.html
https://www.cnblogs.com/shanheyongmu/p/16490399.html
源码讲解:https://zhuanlan.zhihu.com/p/579902298
Netty中的Bytebuf类
(1)Bytebuf会自动扩容
(4)组成(四部分组成:废弃部分、可读部分、可写部分、可扩容部分),因为这种结构在读写之间不需要进行flip转换。
说明:
每个Bytebuf都实现的这个ReferenceCounted接口,这个接口采用引用计数的方法,也就是这个buffer对象被引用则计数器会+1,调用release计数器-1,计数器为0时,内存被回收,即使该对象还在,但方法不可用
那么有一个问题,由谁来负责buffer的回收呢,或者由谁来操作buffer的计数器呢?
答案:我们回顾一下是谁与buffer产生io,在Netty中是由handler与buffer产生IO,从而与客户端通信,handler在pipeline中可能是由一系列的handler来构成整个消息的处理过程,当前的这个buffer最终由最后一个引用的handler来负责回收。图中有一个head和tail两个handler,因为这是一个双向链表,如果有一个buffer在调用过程中一直没有被回收,最终在head或tail中调用,会负责回收。如下如所示: