Netty Buffer

    Netty高性能很大缘由在于Netty Buffer的设计,Netty Buffer由Nio Buffer而来,并对Nio Buffer作了改进。首先,Netty Buffer的“零拷贝”特性使得Netty Buffer的性能十分优越;还有Netty内存池使得Netty Buffer性能大幅提升,内存不断的建立和回收会大幅度地影响性能,内存池刚好解决了这个问题;另外,Nio Buffer操做是比较复杂的,Netty一样作了改进,因此Netty Buffer操做起来十分方便。

零拷贝:
1. Direct Buffer。Netty使用对外的内存进行Socket数据发送和接收,避免了数据的二次拷贝。若是使
JVM堆内存的话,JVM会将数据拷贝到内存,而后进行Socket读写;
2. Composite Buffer。组合Buffer将多个Buffer封装成一个Buffer对外操做,避免了多个Buffer拷贝拼成一个Buffer。

内存池:
PooledByteBuf使用内存池的形式,将内存放在一个集合中,当内存回收时不会马上释放,而是重复利用,从而达到减小内存不断建立和回收的目的。

ByteBuf:
ByteBuf就是个byte容器。ByteBuf被划分为三节:
a) reader index前面的数据是已经读过的数据,这些数据能够扔掉
b) 从reader index开始,到writer index以前的数据是可读数据
c) 从writer index开始,为可写区域

ByteBufAllocator:
ByteBufAllocator是抽象工厂类,ByteBuf实例一般应该由ByteBufAllocator来建立

PooledByteBufAllocator建立PooledByteBuf,维持了一个byte[]和ByteBuffer的池。
UnpooledByteBufAllocator建立UnpooledByteBuf。
PooledByteBuf比UnpooledByteBuf性能要高出20多倍。

ByteBuf:
a) 按照内存实现方式不一样分为:
HeapByteBuf是JVM中的内存,基于byte[]。
DirectByteBuf是经过本地方法建立的JVM以外的内存,基于Nio ByteBuffer。
UnsafeDirectBuf是经过本地方法建立的JVM以外的内存,基于Nio ByteBuffer,系统要提供sun.misc.Unsafe。
DirectByteBuf经过本地方法建立JVM以外的内存,Socket能够直接使用而不须要通过拷贝。

b) 按照是否支持池共享分为:
PooledByteBuf
UnpooledByteBuf

c) CompositeBuf:
CompositeByteBuf是一个虚拟的buffer,将多个buffer展示为一个简单合并的buffer,避免多个小buffer拷贝合并成一个大buffer。
FixedCompositeByteBuf功能相似CompositeByteBuf, 以只读的方式包装一个ByteBuf数组,一般用于写入一组ByteBuf的内容。数组

相关文章
相关标签/搜索