Netty里的內(nèi)存管理是通過ByteBuf這個類作為橋梁連接著業(yè)務(wù)代碼與jdk底層的內(nèi)存麦乞。所以理解ByteBuf的結(jié)構(gòu)就很有必要了鼠冕。
ByteBuf
ByteBuf的內(nèi)部結(jié)構(gòu)如下圖:ByteBuf分類
- Pooled和Unpooled:pooled類型的bytebuf是在已經(jīng)申請好的內(nèi)存塊取一塊內(nèi)存,而Unpooled是直接通過JDK底層代碼申請蹲蒲。
- Unsafe和非Unsafe:這里的Unsafe是JDK底層的對象,通過它能夠直接操作到內(nèi)存侵贵。
- Heap和Direct:一個是在堆上分配届搁,一個是直接內(nèi)存。Direct不受GC的控制窍育。
ByteBufAllocator
ByteBuf對象是通過ByteBufAllocator來進行生成的卡睦,其中AbstractByteBufAllocator里實現(xiàn)在大部分的功能,具體是pooled還是unpooled類型的byteBuf是留給相應(yīng)的子類來實現(xiàn)的漱抓,而Heap和Direct是通過暴露不同的接口來區(qū)分的表锻,Unsafe與非Unsafe是通過JDK內(nèi)部的平臺來進行判斷是否能生成Unsafe類的ByteBuf。ByteBufAllocator類圖如下:UnpooledByteBufAllocator分配heap內(nèi)存
-
通過調(diào)用heapBuffer方法分配一塊heap內(nèi)存
-
根據(jù)平臺是否支持unsafe操作乞娄,生成不同的對象
-
unsafe類的構(gòu)造過程
-
非unsafe類型的直接調(diào)用new byte[]構(gòu)造
-
unsafe類型的byteBuf申請內(nèi)存對象
Unsafe與非Unsafe類型的byteBuf內(nèi)部實現(xiàn)上的差異
-
非unsafe的getByte方法
-
unsafe的getByte方法
UnpooledByteBufAllocator分配direct內(nèi)存
-
UnpooledByteBufAllocator類的newDirectBuffer方法
-
UnpooledUnsafeDirectByteBuf創(chuàng)建流程