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