私は理解しようとしています 若い、 古い そして 永久世代 Javaヒープ用語、より具体的には3世代間の相互作用にあります。
私の質問は:
これはよくある誤解のようです。 OracleのJVMでは、永続的な世代はヒープの一部ではありません。これはクラス定義と関連データ用の独立したスペースです。 Java 6以前では、内部文字列も永続的な世代に格納されていました。 Java 7では、内部文字列はメインオブジェクトヒープに格納されます。
これは 恒久的な生成 についての良い投稿です。
Oracleの JConsoleガイド の各スペースの説明が好きです。
HotSpot Java VMの場合、シリアルガベージコレクションのメモリプールは次のとおりです。
- Eden Space(ヒープ):メモリーが最初にほとんどのオブジェクトに割り振られるプール。
- サバイバースペース(ヒープ):エデンスペースのガベージコレクションを生き残ったオブジェクトを含むプール。
- Tenured Generation(ヒープ):生存期間内にしばらく存在していたオブジェクトを含むプール。
- Permanent Generation(non-heap):クラスやメソッドオブジェクトなど、仮想マシン自体のすべての反映データを含むプール。クラスデータ共有を使用するJava VMでは、この世代は読み取り専用領域と読み書き可能領域に分けられます。
- コードキャッシュ(非ヒープ):HotSpot Java VMには、ネイティブコードのコンパイルと保存に使用されるメモリを含むコードキャッシュも含まれています。
Javaは世代別ガベージコレクションを使用します。つまり、オブジェクトfoo(あるクラスのインスタンス)がある場合、それが存続するガベージコレクションイベントが多いほど(まだ参照されている場合)、それはさらに促進されます。それは若い世代(それ自体は複数の空間に分割されています - EdenとSurvivor)で始まり、それが十分に長く生き残れば最終的には保有世代になります。
ヒープは、次のように若い世代と古い世代に分けられます。
Young Generation:短期間住み、2つのスペースに分かれた場所です。
Old Generation:このプールは基本的には保有された仮想の(予約された)スペースを含み、Young Generationからのガベージコレクションの後に生き残ったオブジェクトを保持します。
Permanent Generation:このメモリプールの名前は、恒久的なクラスのメタデータと記述子の情報も含むため、PermGenスペースは常にクラス用に予約されており、静的メンバーなどのクラスに関連付けられています。
Java8 Update:PermGenはMetaspaceに置き換えられました。これはよく似ています。
主な違いは、Metaspaceが動的にサイズ変更をすること、すなわち実行時に拡張できることである。
Javaメタスペース:無制限(デフォルト)
コードキャッシュ(仮想または予約):HotSpot Javaを使用している場合VMこれには、ネイティブコードのコンパイルと保存に使用されるメモリを含むコードキャッシュ領域が含まれます。
若い世代は何ですか?
Young Generationは、すべての新しいオブジェクトが割り当てられてエージングされる場所です。若い世代がいっぱいになると、これによりマイナーガベージコレクションが発生します。死んだ物でいっぱいの若い世代は非常に早く集められます。生き残った物の中には老化したものもあり、やがて古い世代に移動します。
古い世代は何ですか?
Old Generationは、長く存続するオブジェクトを格納するために使用されます。通常、若い世代のオブジェクトにしきい値が設定され、その年齢に達すると、オブジェクトは古い世代に移動されます。最終的には古い世代を集める必要があります。このイベントは、メジャーガベージコレクションと呼ばれます。
永久的な世代とは何ですか?
永続的生成には、アプリケーションで使用されるクラスとメソッドを記述するためにJVMが必要とするメタデータが含まれています。永続的な生成は、アプリケーションによって使用されているクラスに基づいて、実行時にJVMによって生成されます。
PermGenは、Java 8リリース以降、Metaspaceに置き換えられました。
PermSizeおよびMaxPermSizeパラメータは無視されるようになりました
3つの世代はどのように相互作用しますか。
画像ソースとOracleのTechNoteチュートリアルの記事: http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html
上の記事の「一般的なガベージコレクションプロセス」では、それらの間の相互作用について、多くの図を使って説明しています。
概要図を見てください。
Java仮想マシンは、若い世代、古い世代、および永続的な世代の3世代に編成されています。ほとんどのオブジェクトは、最初は若い世代に割り当てられています。古い世代には、いくつかの若い世代のコレクションを生き残ったオブジェクトや、古い世代に直接割り当てられる可能性がある大きなオブジェクトが含まれています。パーマネントジェネレーションは、クラスやメソッドを記述したオブジェクトや、クラスやメソッド自体など、JVMがガベージコレクタの管理に便利なオブジェクトを保持します。
SunHotSpot JVMのメモリーは、若い世代、古い世代、および永続的な世代の3世代に編成されています。
参考:恒久的なgenはJavaヒープの一部とは見なされていません。
つの世代はどのように相互作用しますか?オブジェクト(大きなものを除く)は最初に若い世代に割り当てられます。オブジェクトがx noの後に生き残っている場合。ガベージコレクションのサイクルのそれは、古い/保有世代に昇格します。したがって、若い世代には寿命の短いオブジェクトが含まれ、古い世代には寿命の長いオブジェクトが含まれていると言えます。永久的なgenは他の二世代と相互作用しません。