0

私は HBase ドキュメントを読んでいて、オフヒープ読み取りパスに出くわしました。 私が理解している限り、このオフヒープは、Java がガベージ コレクターの範囲外にバイト/オブジェクトを格納するメモリ内の場所です。また、オフヒープ メモリの使用を容易にするいくつかのライブラリを検索し、Ehcatcheを見つけました。これは JVM の標準機能ですか、それともある種のハックですか? もしそうなら、これを行うために使用される基本的なクラスとテクニックは何ですか?

4

1 に答える 1

2

ByteBufferを探す必要があります

直接バッファと非直接バッファ

バイト バッファは、直接または非直接のいずれかです。ダイレクト バイト バッファを指定すると、Java 仮想マシンはネイティブ I/O 操作を直接実行するために最善を尽くします。つまり、基礎となるオペレーティング システムのネイティブ I/O 操作のいずれかが呼び出される前 (または後) に、バッファーの内容が中間バッファーに (または中間バッファーから) コピーされるのを回避しようとします。

ダイレクト バイト バッファは、このクラスの allocateDirect ファクトリ メソッドを呼び出すことによって作成できます。このメソッドによって返されるバッファーは、通常、非直接バッファーよりも割り当てと割り当て解除のコストが多少高くなります。ダイレクト バッファーのコンテンツは、通常のガベージ コレクション ヒープの外に存在する可能性があるため、アプリケーションのメモリ フットプリントへの影響は明白ではない場合があります。したがって、ダイレクト バッファは、主に、基盤となるシステムのネイティブ I/O 操作の対象となる大規模で長寿命のバッファに割り当てることをお勧めします。一般に、ダイレクト バッファを割り当てるのは、プログラムのパフォーマンスが測定可能な程度に向上する場合にのみ行うのが最善です。

ダイレクト バイト バッファは、ファイルの領域をメモリに直接マッピングすることによって作成することもできます。Java プラットフォームの実装では、オプションで、JNI を介したネイティブ コードからのダイレクト バイト バッファの作成をサポートする場合があります。これらの種類のバッファのいずれかのインスタンスがメモリのアクセスできない領域を参照している場合、その領域にアクセスしようとしてもバッファの内容は変更されず、アクセス時または後で不特定の例外がスローされます。時間。

バイト バッファが直接か非直接かは、その isDirect メソッドを呼び出すことによって決定できます。このメソッドは、パフォーマンスが重要なコードで明示的なバッファ管理を実行できるようにするために提供されています。

ダイレクト ByteBuffer をどのように処理するかは JVM の実装次第ですが、少なくとも OpenJDK JVM はオフヒープでメモリを割り当てています。

JEP 383: Foreign-Memory Access API (Second Incubator)機能はJava 15で準備中です。この機能は、パブリック API を提供することにより、オフヒープ メモリへのアクセスを標準化します。

于 2021-03-09T14:41:30.853 に答える