ByteBuffer
Javaのサンプルアプリケーションは何ですか?これが使用されているシナリオの例を挙げてください。ありがとうございました!
ByteBuffer
Javaのサンプルアプリケーションは何ですか?これが使用されているシナリオの例を挙げてください。ありがとうございました!
回答:
これは、その使用法と欠点の良い説明です。基本的に、高速な低レベルI / Oを実行する必要がある場合に使用します。TCP / IPプロトコルを実装する場合、またはデータベース(DBMS)を作成する場合は、このクラスが便利です。
ByteBufferクラスは、Javaでチャネルを使用するための基礎を形成するため、重要です。ByteBufferクラスは、Java 7のドキュメントに記載されているように、バイトバッファーに対する操作の6つのカテゴリを定義します。
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
ストリーム指向のAPIを使用するJava IOは、ユーザースペース内のデータの一時ストレージとしてバッファを使用して実行されます。DMAによってディスクから読み取られたデータは、最初にカーネル空間のバッファーにコピーされ、次にユーザー空間のバッファーに転送されます。したがって、オーバーヘッドがあります。これを回避すると、パフォーマンスが大幅に向上します。
カーネル空間のバッファーに直接アクセスする方法があった場合、ユーザー空間のこの一時バッファーをスキップできます。Java NIOはこれを行う方法を提供します。
ByteBuffer
Java NIOによって提供されるいくつかのバッファの1つです。データを読み書きするための単なるコンテナまたは保持タンク。上記の動作はallocateDirect()
、BufferでAPIを使用して直接バッファーを割り当てることによって実現されます。
ここに ByteBufferの利点を説明する素晴らしい記事があります。記事の要点は次のとおりです。
以下は、直接ByteBuffer / MappedByteBufferに特にメリットがあります。直接バッファはヒープの外で作成されることに注意してください:
gcサイクルの影響を受けない:ダイレクトバッファーはヒープの外にあるため、ガベージコレクションサイクル中に移動されません。TerraCotaのBigMemoryキャッシングテクノロジーは、この利点に大きく依存しているようです。ヒープ上にある場合、GCの一時停止時間が遅くなります。
パフォーマンスの向上:ストリームIOでは、読み取り呼び出しはシステムコールを伴い、ユーザーがカーネルモードとその逆のコンテキスト切り替えを必要とするため、特にファイルが常にアクセスされている場合はコストがかかります。ただし、メモリマッピングを使用すると、メモリ内でデータが見つかる可能性が高いため(MappedByteBuffer)、このコンテキストの切り替えが減少します。データがメモリで利用可能な場合、OSを呼び出さずに直接アクセスされます。つまり、コンテキストの切り替えはありません。
MappedByteBuffersは、ファイルが大きく、アクセスされるブロックのグループが少ない場合に特に便利です。