Netty - Buffer 1
3115 ワード
まずBufferとCacheの違いを明らかにしなければならない.
??? ByteBuf ByteBufHolder ByteBufAllocator
JDKでは、バッファは1つの 増加する. 増加する.
初期状態の2つのポインタはいずれも位置
もちろん、ByteBufには、バッファの最大容量を示す
Nettyのバッファには、次の3種類があります. Heap Buffer Direct Buffer Composite Buffer
HeapBufferも最も一般的なByteBufであり、その名の通り、そのデータストレージ空間はJVMのスタックメモリ領域に割り当てられている.実際には内部配列であり、HeapBufferはその内部配列にアクセスすることができる.
non-heap(非スタックメモリ配列)にアクセスすると
ダイレクトバッファとは、メモリ領域がスタック領域ではなく、メモリに直接割り当てられることを意味します.
Socketデータ転送を行う場合、直接バッファを使用するのは良い選択です.非直接バッファを使用する場合、JVMはまずバッファを直接バッファにコピーしてからSocket転送を行う必要があります.
欠点は次のとおりです.ダイレクトバッファのメモリ割り当てと回収のコストは、スタック内バッファよりも高くなります.(これもNettyがバッファをサポートする理由です) ダイレクトバッファを使用すると、スタックバッファを操作するように内部配列を直接操作することはできません.
複合バッファは、実際には複数のバッファインスタンスを組み合わせて、統合ビューを外部に提供します.バッファのリストのようです.
適合バッファは複数のバッファのビューにすぎないため、バッファのhasArray()メソッドはfalseを返します.
???
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スタックバッファ
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転送を行う必要があります.
欠点は次のとおりです.
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);