Java ヒープの用語: 若い世代、古い世代、永久世代? 質問する

Java ヒープの用語: 若い世代、古い世代、永久世代? 質問する

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

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

  • 若い世代とは何ですか?
  • 古い世代とは何ですか?
  • 永久世代とは何ですか?
  • 3 世代はどのように相互に交流/関係しているのでしょうか?

ベストアンサー1

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

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

Oracleの各スペースの説明が気に入りましたJConsoleのガイド:

HotSpot Java VM の場合、シリアル ガベージ コレクションのメモリ プールは次のとおりです。

  • Eden スペース (ヒープ): ほとんどのオブジェクトに最初にメモリが割り当てられるプール。
  • Survivor スペース (ヒープ): Eden スペースのガベージ コレクションを生き残ったオブジェクトを格納するプール。
  • Tenured 世代 (ヒープ): Survivor スペースに一定期間存在していたオブジェクトを含むプール。
  • 永続世代 (非ヒープ): クラスやメソッド オブジェクトなど、仮想マシン自体のすべての反映データを含むプール。クラス データ共有を使用する Java VM では、この世代は読み取り専用領域と読み取り/書き込み領域に分割されます。
  • コード キャッシュ (非ヒープ): HotSpot Java VM には、ネイティブ コードのコンパイルと保存に使用されるメモリを含むコード キャッシュも含まれています。

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

おすすめ記事