Netty Unpooled 內(nèi)存分配

Netty里的內(nèi)存管理是通過ByteBuf這個類作為橋梁連接著業(yè)務(wù)代碼與jdk底層的內(nèi)存。所以理解ByteBuf的結(jié)構(gòu)就很有必要了。

ByteBuf

ByteBuf的內(nèi)部結(jié)構(gòu)如下圖:

這里通過兩個指針,readerIndex與writerIndex分別指向已經(jīng)讀到的位置和寫入的位置,比JDK提供的ByteBuffer 省了flip操作。類結(jié)構(gòu)如圖所示:
ByteBuf類結(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來進(jìn)行生成的,其中AbstractByteBufAllocator里實現(xiàn)在大部分的功能,具體是pooled還是unpooled類型的byteBuf是留給相應(yīng)的子類來實現(xiàn)的,而Heap和Direct是通過暴露不同的接口來區(qū)分的,Unsafe與非Unsafe是通過JDK內(nèi)部的平臺來進(jìn)行判斷是否能生成Unsafe類的ByteBuf。ByteBufAllocator類圖如下:
ByteBufAllocator類圖
UnpooledByteBufAllocator分配heap內(nèi)存
  • 通過調(diào)用heapBuffer方法分配一塊heap內(nèi)存
    AbstractByteBufAllocator的heapBuffer方法
  • 根據(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方法

    image.png
UnpooledByteBufAllocator分配direct內(nèi)存
  • UnpooledByteBufAllocator類的newDirectBuffer方法
  • UnpooledUnsafeDirectByteBuf創(chuàng)建流程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容