ByteBuf是作什麼用的?Netty中傳遞字節數據的容器。數組
使用模式 | 描述 | 優勢 | 劣勢 |
---|---|---|---|
堆緩衝區 | 數據存存儲在JVM的堆空間中,又稱爲支撐數組,經過 hasArray 來判斷是否是在堆緩衝區中 | 沒使用池化狀況下能提供快速的分配和釋放 | 發送以前都會拷貝到直接緩衝區 |
直接緩衝區 | 存儲在物理內存中 |
|
|
複合緩衝 | 單個緩衝區合併多個緩衝區表示 | 操做多個更方便 | - |
ByteBuf自己有必定的容量限制,默認最大的是Integer.MAX_VALUE,超出範圍拋IndeOutOfBoundsExceptionjvm
兩個索引將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實例有本身的索引,可是內部存儲共享,即它的內容修改了源實例也會改變。方法好比 slice / Unpooled.unmodifiableBuffer / order / readSlice / duplicate 。索引
須要徹底獨立的副本則選擇使用 copyip