ネイティブ・ヒープと Java ヒープ

JVM は、Java™ ヒープとネイティブ (またはシステム) ヒープの 2 つのメモリー領域を維持します。 これらの 2 つのヒープの目的は異なり、別々のメカニズムによって保守されます。

Java ヒープは、Java オブジェクトのインスタンスを含み、しばしば「ヒープ」と呼ばれます。 これはガーベッジ・コレクションによって保守される Java ヒープであり、コマンド行ヒープ設定によって変更される Java ヒープです。 Java ヒープは、mmap または shmat (ラージ・ページ・サポートが要求された場合) を使用して割り振られます。 Java ヒープの最大サイズは、最小ヒープ・サイズの設定値が小さい場合でも、JVM の始動時に 1 つの連続域として事前割り振りされます。 この割り振りによって、最小ヒープ・サイズ設定から機械的に適用されるヒープ・サイズ制限を、ヒープ拡張を使用した実際のヒープ・サイズ制限に近づけることができます。 詳しくは、 J9 VM リファレンス の「 メモリー管理 」を参照してください。

ネイティブ・ヒープ (システム・ヒープ) は、オペレーティング・システムの基礎となる malloc およびフリー・メカニズムを使用して割り振られ、特定の Java オブジェクトの基礎となる実装に使用されます。以下に例を示します。
  • AWT および Swing が必要とする Motif オブジェクト。
  • データ圧縮ルーチン用のバッファー。これは、.zip ファイルや .jar ファイルなどの圧縮データの読み取りまたは書き込みを行うために Java クラス・ライブラリーが必要とするメモリー・スペースです。
  • アプリケーションの JNI コードによる malloc 割り振り。
  • Just In Time (JIT) コンパイラーによって生成されたコンパイル済みコード。
  • Java スレッドにマップするスレッド