オフヒープ、ネイティブヒープ、ダイレクトメモリ、ネイティブメモリの違いは何ですか? 質問する

オフヒープ、ネイティブヒープ、ダイレクトメモリ、ネイティブメモリの違いは何ですか? 質問する

最近、JVM の内部を学習しているときにこれらの概念に出会いました。SO にはこれらの概念について個別に多くの質問がすでにあることは承知していますが、それらの関係や、それらが何であるかをまだ理解できません。

今私はそれらを次のように説明します:

  1. ネイティブメモリ通常の JVM ヒープ外のメモリ領域を意味しますが、OS によって JVM プロセス用に確保された合計ユーザー空間メモリの範囲内です (たとえば、32 ビット Windows ではデフォルトで 2 GB です)。この領域は、永続世代 / メソッド領域などの内部データを格納するために JVM によって予約されています。

  2. 直接記憶は、 によってネイティブ メモリを使用することを意味しますjava.nio.DirectByteBuffer

  3. ネイティブヒープは、 を介してネイティブ メモリを使用するunsafe.allocateMemoryか、単にmallocJNI コードで を実行することを意味します。

  4. オフヒープネイティブメモリと同じです。

さらにもう 1 つ質問ですが、JVM プロセス用に確保されている合計メモリ空間 (32 ビット OS では 4 GB) の外部に直接メモリを割り当てることは可能ですか?

私の理解の間違いを指摘し、可能であれば、それについて明確な説明をお願いします。

ベストアンサー1

1)ヒープメモリ: Java オブジェクトを保持するために使用され、JVM のガベージ コレクターによって管理される JVM プロセス内のメモリ。

2)ネイティブメモリ/オフヒープ: プロセスのアドレス空間内に割り当てられたメモリですが、ヒープ内にはないため、Java ガベージ コレクターによって解放されません。

3)直接記憶: ネイティブに似ていますが、ハードウェア内の基礎となるバッファが共有されていることも意味します。たとえば、ネットワーク アダプタやグラフィック ディスプレイ内のバッファなどです。ここでの目標は、メモリ内で同じバイトがコピーされる回数を減らすことです。

最後に、OS によっては、Unsafe alloc やファイルのメモリ マッピングによって追加のネイティブ割り当て (メモリ アドレス空間の割り当て) を実行できます。ファイルのメモリ マッピングは、マシンが現在物理 RAM として持っているメモリよりも多くのメモリを簡単に割り当てることができるため、特に興味深いものです。また、合計アドレス空間の制限は、使用されているポインタのサイズによって制限され、32 ビット ポインタは 4 GB を超えることはできません。以上です。

おすすめ記事