Netty bytebuf 源碼解析

java nio bytebuffer 和 bytebuf的對比
1. 原生的類長度固定,不能動態擴容和收縮
2. 只有一個讀寫標誌位 position, 操作不靈活
3. API較少,一些適用的操作不支持。

這裏寫圖片描述

ByteBuf 實現類的分配
按內存分配看,
1. 堆內存, 內存分配和回收較快, Socket I/O 讀寫需要內存複製,會變慢
2. 直接內存。對應上面則較慢, 較快
建議: I/O 通信線程的讀寫緩衝區使用DirectByteBuf。 後端業務消息的編解碼塊使用HeapByteBuf.
從內存回收看
1. 基於對象池的ByteBuf. 高負載,大併發
2. 普通ByteBuf。

writeBytes(ByteBuf src, int srcIndex, int length)
擴容方式: 固定閾值是4mb, 如果大於4M 就採用步長的增長方式
小於4m的就用倍數的增長方式。步長和倍數兩種方式混合使用,目的就是爲了有效利用空間。

UnpooledHeapByteBuf 基於堆,沒有基於對象池技術實現,每一次I/O 讀寫都會創建一個新的

PooledDirectByteBuf 對象池技術 與UnPo….不同的是內存分配策略不太一樣。
一次性申請一大塊內存,這樣就不需要頻繁地申請和釋放內存了。

chunk 16個page, 一個page 4個字節, 二叉樹。
page
PoolSubpage page中的內存分配,取決於第一塊的內存大小。

ByteBuf 輔助類 ByteBufHolder 封裝一個ByteBuf ,添加其他的輔助方法,例如http 消息體 CompositeByteBuf 將多個ByteBuf組合在一起,相當於視圖的功能。 ByteBufAllocator 字節緩衝分配器 (兩種基於內存池和普通)