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的內容。數組