Netty解析十九:Netty中的buffer
Netty自己封装了一个缓存区对象ByteBuf,那么就看看ByteBuf与Nio的buffer相比有什么优点呢。
ByteBuf
ByteBuf使用模式
heap buffer(堆缓冲区)
- 数据存储在 JVM 的堆空间
- GC 可以及时释放内存空间
direct buffer(直接缓冲区)
- 没有中间内存交换的二次拷贝,也就是通常说的“零”拷贝。
- 驻留在垃圾回收扫描的堆区以外,需要手工管理内存(分配和释放等)。
- 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响。
composite buffer(复合缓冲区)
- 可以创建多个不同的 ByteBuf,然后提供一个这些 ByteBuf 组合的视图。
- 复合缓冲区就像一个列表,我们可以动态的添加和删除其中的 ByteBuf,JDK 的 ByteBuffer 没有这样的功能。
ByteBuf的结构
byteBuf维护了两个不同的索引:一个是用于读取,一个用于写入。当你从ByteBuf读取是,它的readerIndex将会被递增已经被读取的字节数。同样地,当你写入ByteBuf时,它的witerIndex也会被递增。
定义在AbstractByteBuf中1
2int readerIndex;
int writerIndex;
ByteBuf的分类
主要可以分为以下的类别:
- 池化的/非池化的
- Direct/Heap
- Safe/UnSafe
这些类别可以相互组合形成一个ByteBuf类