Netty - Buffer 1

3115 ワード

まずBufferとCacheの違いを明らかにしなければならない.
???
  • ByteBuf
  • ByteBufHolder
  • ByteBufAllocator

  • ByteBuf


    JDKでは、バッファは1つのpositionポインタのみが読み取り/書き込みのために使用されると理解され、詳細は、JDKとは異なり、Nettyでバッファが2つの指示位置を有するポインタがそれぞれ読み取り/書き込みのために使用される文書を参照することができる.
  • readerIndexの読み出し動作時、この値は
  • 増加する.
  • writerIndex書き込み時、この値は
  • 増加する.
    初期状態の2つのポインタはいずれも位置0を指し、通常read writeの操作は2つのポインタ値を自動的に増加させ、get setのような相対位置の操作はポインタ値を変更しない.
    もちろん、ByteBufには、バッファの最大容量を示すmaximumがあります.デフォルトではInteger.MAX_VALUEです.
    Nettyのバッファには、次の3種類があります.
  • Heap Buffer
  • Direct Buffer
  • Composite Buffer

  • Heap Bufferスタックバッファ


    HeapBufferも最も一般的なByteBufであり、その名の通り、そのデータストレージ空間はJVMのスタックメモリ領域に割り当てられている.実際には内部配列であり、HeapBufferはその内部配列にアクセスすることができる.
    non-heap(非スタックメモリ配列)にアクセスするとUnsupportedOperationExceptionになるので、ByteBuf内部配列にアクセスする場合はhasArray()でチェックする必要があります.
    ByteBuf heapBuf = Unpooled.copiedBuffer("Netty IO", Charset.forName("UTF-8"));
    if (heapBuf.hasArray()) {
        System.out.println("Has Array");
        byte[] array = heapBuf.array();
        int offset = heapBuf.arrayOffset();
        int length = heapBuf.readableBytes();
        System.out.println("offset="+ offset +" length="+length);
            
        System.out.println("capacity=" + heapBuf.capacity());
        System.out.println("isDirect=" + heapBuf.isDirect());
        System.out.println("isReadable=" + heapBuf.isReadable());
        System.out.println("isReadOnly=" + heapBuf.isReadOnly());
    } else {
        System.out.println("Hasn't Array");
    }
    

    Direct Bufferダイレクトバッファ


    ダイレクトバッファとは、メモリ領域がスタック領域ではなく、メモリに直接割り当てられることを意味します.
    Socketデータ転送を行う場合、直接バッファを使用するのは良い選択です.非直接バッファを使用する場合、JVMはまずバッファを直接バッファにコピーしてからSocket転送を行う必要があります.
    欠点は次のとおりです.
  • ダイレクトバッファのメモリ割り当てと回収のコストは、スタック内バッファよりも高くなります.(これもNettyがバッファをサポートする理由です)
  • ダイレクトバッファを使用すると、スタックバッファを操作するように内部配列を直接操作することはできません.
  • ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer();
    directBuf.writeBytes("Netty IO".getBytes());
    if (!directBuf.hasArray()) {
        System.out.println("No Array");
        int length = directBuf.readableBytes();
        byte[] copyArray = new byte[length];
        directBuf.getBytes(0,copyArray);
                
        System.out.println((char)copyArray[0]);
    } else {
        System.out.println("Has Array");
    }
    

    Composite Buffer複合バッファ


    複合バッファは、実際には複数のバッファインスタンスを組み合わせて、統合ビューを外部に提供します.バッファのリストのようです.
    適合バッファは複数のバッファのビューにすぎないため、バッファのhasArray()メソッドはfalseを返します.
    ByteBuf heapBuf = Unpooled.copiedBuffer("Heap", Charset.forName("UTF-8"));
    ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer().writeBytes("Direct".getBytes());
    
    CompositeByteBuf compositeBuf = ByteBufAllocator.DEFAULT.compositeBuffer();
    compositeBuf.addComponent(heapBuf);
    compositeBuf.addComponent(directBuf);