Netty中的ByteBuf詳解

ByteBuf是作什麼用的?Netty中傳遞字節數據的容器。數組

ByteBuf的使用模式有那些?

使用模式 描述 優勢 劣勢
堆緩衝區 數據存存儲在JVM的堆空間中,又稱爲支撐數組,經過 hasArray 來判斷是否是在堆緩衝區中 沒使用池化狀況下能提供快速的分配和釋放 發送以前都會拷貝到直接緩衝區
直接緩衝區 存儲在物理內存中
  • 能獲取超過jvm堆限制大小的空間
  • 寫入channel比堆緩衝區更快
  • 釋放和分配空間昂貴(使用系統的方法)
  • 操做時須要複製一次到堆上
複合緩衝 單個緩衝區合併多個緩衝區表示 操做多個更方便 -

ByteBuf如何訪問?

  1. 下標訪問:get,set開頭的相關方法,不修改索引
  2. 索引訪問:read,write開頭的方法,根據已經訪問過的字節對索引進行調整[索引是ByteBuf內置的readIndex和writeIndex]

ByteBuf自己有必定的容量限制,默認最大的是Integer.MAX_VALUE,超出範圍拋IndeOutOfBoundsExceptionjvm

ByteBuf索引操做是怎樣?

兩個索引將ByteBuf分隔成3個區域工具

任何新分配的、包裝的或者複製的默認大小readerIndex/writeIndex都是0,任何read或者skip開頭的都會增長readerIndex已讀字節數,write開頭的操做則會增長writeIndex相應字節數。另外參數中包含ByteBuf且沒有目標索引的[好比 readBytes(ByteBuf dest) writeBytes(ByteBuf dest)],會影響對應的readerIndex(寫的方法影響readerIndex)writeIndex(讀的方法影響writeIndex)。3d


調用discardReadBytes()會移動可讀字節到下標0,可讀字節平移(原來可讀字節的內容沒有作擦除,只是移動了writeIndex)cdn


調用clear()方法,則僅重置索引,使得readIndex和writeIndex爲0,不作任何內存複製blog


ByteBuf的派生緩衝區是什麼?

ByteBuf專門呈現內容視圖的方法,它們返回新的ByteBuf實例有本身的索引,可是內部存儲共享,即它的內容修改了源實例也會改變。方法好比 slice / Unpooled.unmodifiableBuffer / order / readSlice / duplicate 。索引

須要徹底獨立的副本則選擇使用 copyip

ByteBuf有沒有其它方式來管理實例?

  1. ByteBufAllocator:使用ChannelHandleContext(Channel每一個都有不一樣的實例,或者ChannelHandler獲取)可以拿到它的引用,Netty從4.1.x開始默認使用池化(PooledByteBufAllocator)實現,能最大程度的減小內存碎片,另一種方式是非池化(UnpooledByteBufAllocator)每次返回一個新實例;
  2. Unpooled:一個工具類,提供靜態方法建立未池化的ByteBuf
  3. ByteBufUtil:實現一些使用的方法,好比equals判斷兩個ByteBuf是否是相等,hexdump以十六進制打印ByteBuf內容
相關文章
相關標籤/搜索