當前位置:編程學習大全網 - 源碼下載 - [Netty源碼分析]ByteBuf(壹)

[Netty源碼分析]ByteBuf(壹)

ByteBuf通過兩個指針協助讀寫操作,讀操作使用readerIndex,寫操作使用writerIndex.

readerIndex、writerIndex初始值是0,寫入數據時writerIndex增加,讀取數據時readerIndex增加,但是readerIndex不會超過writerIndex.

讀取之後,0-readerIndex之間的空間視為discard的,調用discardReadByte方法可以釋放這壹部分空間,作用類似於ByteBuffer的compact方法.readerIndex-writerIndex之間的數據是可讀的,等價於ByteBuffer中position-limit之間的數據.

writerIndex-capacity之間的空間是可寫的,等價於ByteBuffer中limit-capacity之間的空間.

讀只影響readerIndex、寫只影響writerIndex,讀寫之間不需要調整指針位置,所以相較於NIO的ByteBuffer,可以極大的簡化讀寫操作

調用discardReadBytes會發生字節數組的內存復制,所以頻繁調用會導致性能下降

ByteBuf對write操作進行了封裝,有ByteBuf的write操作負責進行剩余咳喲好難過空間的校驗,如果可用緩沖區不足,ByteBuf會自動進行動態擴展。對於使用者而言不需要關心底層的校驗和擴展細節,只需要不超過capacity即可

對緩沖區進行讀操作時,有的時候我們需要對之前的操作進行回滾,讀操作並不會改變緩沖區的內容,回滾主要是重新設置索引信息

Mark:將當前的位置指針被分到mark變量中

Reset:恢復位置指針為mark中的變量值

ByteBuf有readerIndex、writerIndex,所以有四個相應的方法

markReaderIndex: 將當前readerIndex備份到markedReaderIndex中

resetReaderIndex: 將當前readerIndex設置為markedReaderIndex

markWriterIndex: 將當前readerIndex備份到markedWriterIndex中

resetWriterIndex: 將當前readerIndex設置為markedWriterIndex

3)slice:

返回當前ByteBuf的可讀子緩沖區,即從readerIndex到writerIndex的ByteBuf,返回的ByteBuf和原有緩沖區***享內容,但是維護獨立的索引.當修改其中壹個ByteBuf的內容時,另壹個也會改變,即雙方持有的是同壹個對象的引用

常見類:

相比於PooledHeapByteBuf,UnpooledHeapByteBuf的實現更加簡單,也不容易出現內存管理的問題,所以才性能滿足的情況下,推薦使用UnpooledHeapByteBuf

在I/O通信線程的讀寫緩沖區中使用DirectByteBuf,後端業務消息的編碼使用HeapByteBuf,這樣的組合性能最優

  • 上一篇:帝國時代4中國詳解攻略中國機制與打法思路分享
  • 下一篇:c++ cstring排序源碼
  • copyright 2024編程學習大全網