質問

の概念が何なのかを理解しようとしています 若い, 古い そして 永久世代 これは Java ヒープ用語であり、より具体的には 3 つの世代間の相互作用を指します。

私の質問は次のとおりです。

  • 若い世代とは何ですか?
  • 旧世代とは何ですか?
  • 永続世代とは何ですか?
  • 3世代は互いにどのように相互作用/関係していますか?
役に立ちましたか?

解決

これはよくある誤解のようです。Oracle の JVM では、永続世代はヒープの一部ではありません。これは、クラス定義と関連データ用の別のスペースです。Java 6 以前では、インターンされた文字列も永続世代に格納されていました。Java 7 では、インターンされた文字列はメイン オブジェクト ヒープに格納されます。

ここに良い投稿があります 永久世代.

Oracle の各スペースに与えられた説明が好きです JConsole のガイド:

HotSpot Java VMの場合、メモリー シリアル・ガーベッジ・コレクションのプール 以下です。

  • エデンスペース (ヒープ):メモリが最初に割り当てられるプール ほとんどのオブジェクトに対応できます。
  • Survivor スペース (ヒープ):存続したオブジェクトを含むプール エデンの園のガベージコレクション 間。
  • テニュア世代 (ヒープ):存在したオブジェクトを含むプール しばらくの間、Survivorスペースで。
  • 永続的な世代 (非ヒープ):すべての反射を含むプール 仮想マシン自体のデータ、 クラスやメソッドオブジェクトなど。で クラス・データ共有を使用するJava VM、 この世代は次のように分かれます。 読み取り専用領域と読み取り/書き込み領域。
  • コード キャッシュ (非ヒープ):HotSpot Java VMには、コード・キャッシュ このメモリは、 ネイティブのコンパイルと保存 コード。

Java は世代別ガベージ コレクションを使用します。これは、オブジェクト foo (何らかのクラスのインスタンス) がある場合、そのオブジェクトが生き残るガベージ コレクション イベントが多いほど (オブジェクトへの参照がまだある場合)、さらに昇格されることを意味します。それは若い世代 (それ自体が複数のスペース (エデンとサバイバー) に分割されている) で始まり、十分に長く生き残れば最終的には終身世代に終わります。

他のヒント

ヒープは次のように若い世代と古い世代に分割されます。

若い世代 :短期間住んでいた場所で、二つの空間に分かれています。

  • エデンスペース :新しいキーワード memory を使用してオブジェクトが作成されたとき、割り当てられました このスペースで。
  • サバイバースペース :これは、 EdenスペースからのJavaガベージコレクション後も存続しました。

旧世代 :このプールには、基本的に tenured と virtual が含まれています (予約済み)スペースであり、生き残ったオブジェクトを保持します ヤングジェネレーションからのガベージコレクションの後。

  • 保有スペース: このメモリ プールには、複数のガベージ コレクション後に生き残ったオブジェクトが含まれています。これは、Survivor 空間からのガベージ コレクション後に生き残ったオブジェクトを意味します。

永続的な世代: このメモリ プールには名前の通り、永続的なクラス メタデータと記述子の情報も含まれているため、PermGen スペースは常にクラスと、クラスに関連付けられている静的メンバー用に予約されています。

Java8 アップデート: パーマジェン と置き換えられます メタスペース これは非常によく似ています。
主な違いは、Metaspace が動的にサイズを変更する、つまり実行時に拡張できることです。
Java メタスペース スペース:無制限 (デフォルト)

コードキャッシュ (仮想または予約):HotSpot Java VM を使用している場合、これには、ネイティブ コードのコンパイルと保存に使用されるメモリを含むコード キャッシュ領域が含まれます。

enter image description here

礼儀

  若い世代は何ですか?

すべての新しいオブジェクトが割り当てられて熟成されている。ここで、

の若い世代のです。若い世代がいっぱいになると、これはマイナーガベージコレクションが発生します。死んだオブジェクトの完全な若い世代は非常に迅速に収集されます。いくつか生き残ったオブジェクトは、高齢者があり、最終的に古い世代に移動します。

  

タグ?古い世代は何ですか

の旧世代のが長く生き残ったオブジェクトを格納するために使用されます。一般的に、しきい値は、若い世代のオブジェクトに設定されており、その年齢が満たされたとき、オブジェクトは古い世代に移動します。最終的に古い世代を収集する必要があります。このイベントは、の主要なガベージコレクション

と呼ばれています
  

永久世代は何ですか?

の永久世代のメタデータは、アプリケーションで使用するクラスとメソッドを記述するためにJVMによって要求が含まれています。永久的な生成は、アプリケーションによって使用中のクラスに基づいて、実行時にJVMによって移入されます。

のPermGenは、Java 8のリリース以来、メタスペースに置き換えられました。

のPermSizeを&MaxPermSizeをのパラメータは、

今無視されます。
  

どのようにして3世代相互作用/相互関係?

 ここに画像の説明を入力

画像ソース&オラクルtechnetworkチュートリアル記事:ます。http: //www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.htmlする

の一般的なガベージコレクションプロセスの」上記の記事では、多くの図とそれらの間の相互作用を説明します。

概要図を見てください。

 ここに画像の説明を入力

若い世代、旧世代、そして永久世代:

は、Java仮想マシンは、3つの世代に編成されます。ほとんどのオブジェクトは、最初は、若い世代に割り当てられています。古い世代は、若い世代のコレクションのいくつかの数だけでなく、古い世代に直接割り当てることも、いくつかの大規模なオブジェクトを生き残ったオブジェクトが含まれています。永久的な生成は、JVMは、ガベージコレクタは、そのようなオブジェクトは、クラスやメソッド、ならびにクラスおよびメソッド自身を説明するものとして、管理有することが便利見つけたオブジェクトを保持します。

SunHotSpot JVM のメモリは、次の 3 つの世代に構成されます。若い世代、古い世代、永続的な世代。

  • 若い世代 :新しく作成されたオブジェクトは若い世代に割り当てられます。
  • 旧世代:新しいオブジェクトがより大きなヒープ領域を要求すると、古い世代に直接割り当てられます。また、数回の GC サイクルを生き延びたオブジェクトは古い世代に昇格します。つまり、長く存続するオブジェクトは古い世代に格納されます。
  • 永続的な世代:永続世代には、クラスやメソッドを記述するオブジェクトや、クラスやメソッド自体など、JVM がガベージ コレクターに管理させると便利だと思われるオブジェクトが保持されます。

ご参考までに:永続的な gen は Java ヒープの一部とは見なされません。

3世代は互いにどのように相互作用/関係していますか?オブジェクト (大きなオブジェクトを除く) は、最初に若い世代に割り当てられます。x の後にオブジェクトが生存している場合は、いいえ。ガベージ コレクション サイクルが終わると、古い世代/終身世代に昇格します。したがって、若い世代には寿命の短いオブジェクトが含まれ、古い世代には寿命の長いオブジェクトが含まれていると言えます。永続世代は、他の 2 つの世代と対話しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top