直接内存&堆内存
ByteBuf buffer = ByteBufAllocator.DEFAULT.heapBuffer(10);
ByteBuf byteBuf = ByteBufAllocator.DEFAULT.directBuffer(10);
组成
ByteBuf维护了两个不同的索引,一个用于读取,一个用于写入。
写入
内存回收
- 堆内存使用的是JVM内存,等待GC即可。
- 直接内存,建议手动回收内存
Netty采用引用计数法来控制回收内存。谁是最终使用者,谁来释放ButeBuf.
- 每个ByteBuf对象的初始计数为1
- 调用relase方法计数减1,如果计数为0,ByteBuf被回收
- 调用retain方法啊计数加一,表示调用者没用完之前,其他hander即使调用了release也不会造成回收。
slice
对原始的ByteBuf进行切片成多个ButeBuf,切片后的ButeBuf拥有独立的读写指针。切片后对最大容量做了限制。
composite
将ByteBuf逻辑上组合到一起,避免内存复制。