現在、jconsoleを使用してJavaアプリケーションを監視しています。[メモリ]タブでは、次のいずれかを選択できます。
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
それらの違いは何ですか?
現在、jconsoleを使用してJavaアプリケーションを監視しています。[メモリ]タブでは、次のいずれかを選択できます。
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
それらの違いは何ですか?
回答:
ヒープメモリは、Java VMがすべてのクラスインスタンスと配列にメモリを割り当てるランタイムデータ領域です。ヒープのサイズは、固定でも可変でもかまいません。ガベージコレクターは、オブジェクトのヒープメモリを再利用する自動メモリ管理システムです。
Eden Space:ほとんどのオブジェクトにメモリが最初に割り当てられるプール。
Survivor Space:Edenスペースのガベージコレクションを生き残ったオブジェクトを含むプール。
Tenured GenerationまたはOld Gen:サバイバースペースにしばらくの間存在していたオブジェクトを含むプール。
非ヒープメモリには、すべてのスレッドで共有されるメソッド領域と、Java VMの内部処理または最適化に必要なメモリが含まれます。ランタイム定数プール、フィールドとメソッドのデータ、メソッドとコンストラクターのコードなど、クラスごとの構造を格納します。メソッド領域は論理的にはヒープの一部ですが、実装によっては、Java VMがガベージコレクションや圧縮を行わない場合があります。ヒープメモリと同様に、メソッド領域のサイズは固定または可変です。メソッド領域のメモリは連続している必要はありません。
Permanent Generation:クラスやメソッドオブジェクトなど、仮想マシン自体のすべてのリフレクティブデータを含むプール。クラスデータ共有を使用するJava VMでは、この生成は読み取り専用領域と読み書き領域に分けられます。
コードキャッシュ:HotSpot Java VMには、ネイティブコードのコンパイルと保存に使用されるメモリを含むコードキャッシュも含まれています。
新しいキーワードは、Javaヒープにメモリを割り当てます。ヒープは、アプリケーション全体からアクセス可能なメモリのメインプールです。そのオブジェクトに割り当てるのに十分なメモリがない場合、JVMはガベージコレクションを使用してヒープからメモリを回収しようとします。それでも十分なメモリを取得できない場合は、OutOfMemoryErrorがスローされ、JVMが終了します。
ヒープは、世代と呼ばれるいくつかの異なるセクションに分割されます。オブジェクトがガベージコレクションを存続させるにつれて、オブジェクトはさまざまな世代に昇格します。古い世代は、ガベージコレクションの頻度が高くありません。これらのオブジェクトはすでに長寿命であることが証明されているため、ガベージコレクションされる可能性は低くなります。
オブジェクトが最初に構築されるとき、それらはエデンスペースに割り当てられます。ガベージコレクションを生き残った場合、それらはサバイバースペースに昇格し、そこで十分に長く生きると、Tenured Generationに割り当てられます。この世代は、ガベージコレクションの頻度がはるかに低くなります。
また、Permanent Generation(PermGen)と呼ばれる第4世代もあります。ここにあるオブジェクトはガベージコレクションの対象ではなく、通常、クラス定義や文字列定数プールなど、JVMの実行に必要な不変の状態が含まれています。PermGenスペースはJava 8から削除される予定で、ネイティブメモリーに保持されるMetaspaceと呼ばれる新しいスペースに置き換えられることに注意してください。参照:http : //www.programcreek.com/2013/04/jvm-run-time-data-areas/
-XX:PermSize
、そう-XX:MaxPermSize
ではないはずです。
Java8では、非ヒープ領域にPermGenは含まれていませんが、メタスペースはJava8の主要な変更であり、メタデータのサイズは、jvmがクラスデータに必要とするスペースに応じて増加する可能性があるため、Javaのメモリ不足エラーを取り除くことになっています。
Javaヒープメモリは、オペレーティングシステムによってJVMに割り当てられたメモリの一部です。
オブジェクトは、ヒープと呼ばれる領域にあります。ヒープは、JVMの起動時に作成され、アプリケーションの実行中にサイズが増減する場合があります。ヒープがいっぱいになると、ガーベッジが収集されます。
Eden Space、Survivor Space、Tenured Space、Permanent Generationの詳細については、以下のSEの質問をご覧ください。
PermGenは、Java 8リリース以降、メタスペースに置き換えられました。
あなたの質問について:
コードキャッシュ: Java仮想マシン(JVM)はネイティブコードを生成し、コードキャッシュと呼ばれるメモリ領域に格納します。JVMは、動的に生成されるインタープリターループ、Java Native Interface(JNI)スタブ、ジャストインタイム(JIT)コンパイラーによってネイティブコードにコンパイルされるJavaメソッドなど、さまざまな理由でネイティブコードを生成します。JITは、コードキャッシュの最大のユーザーです。