1. ホーム
  2. java

[解決済み] Javaヒープ用語:若い世代、古い世代、永久世代?

2022-03-17 07:58:24

質問

の概念を理解しようとしています。 ヤング , 古い 永久世代 は、Javaのヒープ用語で、より具体的には3世代間の相互作用です。

私の疑問は

  • ヤングジェネレーションとは何ですか?
  • オールドジェネレーションとは何ですか?
  • パーマネント・ジェネレーションとは何ですか?
  • 3世代はどのように相互作用/関連しているのでしょうか?

どのように解決するのか?

これはよくある誤解のような気がします。OracleのJVMでは、永久世代はヒープの一部ではありません。それは、クラス定義と関連するデータのための独立した空間です。Java 6以前では、インターンされた文字列もパーマネント世代に格納されていた。Java 7では、インターンされた文字列はメイン・オブジェクト・ヒープに格納されます。

に関する良い記事をご紹介します。 永久保存版 .

オラクルの各スペースに付けられた説明文が好きです。 JConsoleのガイド :

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

  • エデンスペース(ヒープ)。メモリが最初に割り当てられるプール は、ほとんどのオブジェクトで使用されます。
  • 生存者空間(ヒープ)。生存しているオブジェクトを含むプール。 のガベージコレクションは、エデン の空間です。
  • テニュア世代(ヒープ)。存在するオブジェクトを含むプール 生存者空間におけるしばらくの間。
  • Permanent Generation (非ヒープ)。すべての反射的な 仮想マシン自体のデータ。 クラスやメソッドのオブジェクトなど。とは クラスデータ共有を使用するJava VM。 この世代は read-onlyとread-writeの領域があります。
  • コードキャッシュ(非ヒープ)。HotSpot Java VMには、コードキャッシュも含まれています。 のために使用されるメモリが含まれています。 のコンパイルと保存を行います。 コードになります。

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