ByteBufは基礎となるIOを直接処理します
1.メモリカテゴリとは
2.マルチスレッドメモリ割り当ての競合を減らす方法
3.異なるサイズのメモリを割り当てる方法
メモリとメモリマネージャの抽象化
さまざまなサイズとメモリタイプの割り当て方法
メモリの再利用
ByteBuf構造体
readerIndex。読み取るデータが現在のポインターから始まることを示し、0からreaderIndexまでのスペースは無効であることを示します。
writerIndexは、readerIndexより大きい必要があります。これは、書き込まれるデータが現在のポインターから始まることを示し、readerIndexからwriterIndexまでのスペースは、読み取り可能であることを示します。
容量、必須、writerIndexからcapacityまでのスペースは、書き込みが自由であることを示します
ByteBuf API
読み取り、readerIndexから読み取りを開始
writerIndex以降から書き込みを開始します
setはポインタを移動せず、現在のポインタに直接設定します
markReaderIndexはreaderIndexを保存します
resetReaderIndexは、readerIndexを復元するため、データを読み取ってもポインターは移動しません。
markWriterIndex上記と同じ
resetWriterIndex上記と同じ
readableBytes()writerIndex-readerIndex
writeableBytes()容量-writerIndex
ByteBuf分類
プールされ、UnPooled、すでに割り当てられているメモリからメモリを割り当てる場合、事前割り当てプロセスがあり、UnPooledはオペレーティングシステムから直接メモリに適用されます
Unsafeと非UnSafe、Unsafeはメモリアドレスを直接取得できます。メモリアドレスとオフセットを介してJVMメモリ内のByteBufを直接取得できます。非危険では、jdk apiを直接呼び出して、配列と添え字を介してデータの読み取りと書き込み、データへのアクセスを行うことができます。jdkは自動的にUnsafeまたはNon-Unsafeを決定します
ヒープに直接割り当てられ、ヒープに直接割り当てられ、jc自動リサイクル管理、配列に依存します。直接呼び出しjdk api割り当ては、jdkの基礎となるByteBufferに依存して、jvmメモリリサイクルによって管理されません。
ByteBufAllocatorメモリマネージャ
AbstractByteBufAllocatorスケルトン実装
UnPooledByteBufAllocator、容量の配列を直接割り当てます
newHeapBufferヒープ上の新しい配列が出て保存されます
newDirectBufferは、jdkの基礎となるByteBufferに依存して、初期アドレスと容量を保存します。
PooledByteBufAllocator、最初にスレッドローカルキャッシュを取得、PoolThreadCacheは最初にこれら2つのメモリプールであるPoolArena <byte []>、PoolArena <ByteBuf>を作成し、スレッド上のArenaでメモリ割り当てを実行します。メモリアロケータを作成すると、PoolArena.HeapArenaとPoolArena.directArenaの2種類の配列が作成されます。
newHeapBuffer
newDirectBuffer