数据载体ByteBuf
在Netty中,数据的读写是以ByteBuf
为读写单位进行交互的,他通过两个位置来协助缓冲区的读写操作,读操作使用readerIndex
、写操作使用writerIndex
。
图片作者来源:
作者:Ashleejy
链接:https://juejin.cn/post/7206924411256176696
ByteBuf的结构原理有些类似于C++的vector。
读操作的时候:readIndex++,读取的内容为,readIndex - writeIndex,但是不会超过writeIndex。 之后0~readIndex的数据视为discard
无用,调用discardReadBytes
方法可以释放掉。
写操作的时候:writeIndex++,write ~ capacity之间的数据都是可以写的。
相关的API操作
参考文档:ByteBuf (Netty API Reference (4.1.100.Final))
ByteBuf的release()与retain()
由于Netty使用了堆外内存,而堆外内存事不被JVM直接管理的,无法被垃圾回收器直接回收,所以需要手动回收。类似与C++中的内存泄漏。
ByteBuf通过引用计数的方式管理,如果一个ByteBuf不再被引用,那么就要释放底层占用的内存。
eBuf不再被引用,那么就要释放底层占用的内存。