Nettyソースコード分析(4)-メモリ割り当て

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

 

おすすめ

転載: www.cnblogs.com/xiaofeiyang/p/12688010.html