Javaヒープの用語:若い世代、古い世代、永続的な世代?


318

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

私の質問は:

  • 若い世代とは何ですか?
  • 古い世代は何ですか?
  • 永続的な世代とは何ですか?
  • 3つの世代はどのように相互に作用/関連していますか?

Sun JDK / OpenJDKについて話していると仮定して、ストレージ管理に関するOpenJDK Webサイトのページを参照してください。下部にはさらに多くの情報へのリンクがいくつかあります。
Nicholas Riley

1
この質問「
tenured

回答:


304

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

これは永久生成に関する良い投稿ですます。

JConsoleに関する Oracleのガイドの各スペースの説明が気に入っています。

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

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

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


2
Java 7以降、永続的な世代で文字列がインターンされなくなったと思います。
ティムグッドマン

おっしゃるとおりですが、これが言及されるまでに長く生き延びたことには驚いています。その後、Java 8でパーマネントジェネレーションがメタスペースに置き換えられます(ただし、デフォルトで制限されていないことを除けば、これが実際にどの程度異なるかはわかりません)
Joshua McKinnon

9
ジョシュア-「古い」は「在任」と同義語であり、「新しい」は「生存者」と同義語ですか。
joadha 14

1
パーマ世代前のJava 8にのみ適用可能である
lwpro2

2
あなたがまだ答えを待っている場合には、はい、あなたは正しい@joadhaです。このリンクをチェックしてください:codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

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

ヤングジェネレーション:短期間暮らし、2つの空間に分かれた場所です。

  • Eden Space:オブジェクトがこのスペースに割り当てられた新しいキーワードメモリを使用して作成された場合。
  • Survivor Space:これは、EdenスペースからのJavaガベージコレクションの後に生き残ったオブジェクトを含むプールです。

Old Generation:このプールには基本的に、保有期間と仮想(予約)スペースが含まれており、Young Generationからのガベージコレクション後に生き残ったオブジェクトを保持します。

  • Tenured Space:このメモリプールには、複数のガベージコレクション後に生存したオブジェクトが含まれ、Survivorスペースからのガベージコレクション後に生存したオブジェクトを意味します。

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

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

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

ここに画像の説明を入力してください

礼儀


@Premrajメタスペースは動的にサイズを変更することを意味します。つまり、実行時に拡張できます。?デフォルトでは上枠がないという唯一の違いは?
gstackoverflow 2016

1
優れています。この図のメソッド領域、nativestack、およびランタイム定数プールがどこにあるか知っていますか?そしてそれに応じて何を保持していますか?

ネイティブメソッドコードにコードキャッシュが使用されている場合、ネイティブメソッドスタック(各スレッドに1つ)には何がありますか?

49

若い世代とは何ですか?

若い世代は、すべての新しいオブジェクトが割り当てられて熟成されているところです。若い世代がいっぱいになると、マイナーガベージコレクションが発生します。死んだオブジェクトでいっぱいの若い世代は非常に速く収集されます。一部の生き残ったオブジェクトは古くなり、最終的には古い世代に移動します。

古い世代は何ですか?

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

永続的な世代とは何ですか?

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

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

PermSizeおよびMaxPermSizeパラメータは無視されます

3つの世代はどのように相互に作用/関連していますか?

ここに画像の説明を入力してください

イメージソースとOracle technetworkチュートリアルの記事:http ://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

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

要約図を見てください:

ここに画像の説明を入力してください


優れています。メソッド領域、ネイティブスタック、およびランタイム定数プールがこの図のどこにあるのか知っていますか?そしてそれに応じて何を保持していますか?

詳細については、docs.oracle.com / javase / specs / jvms / se7 / html / jvms-2.htmlを参照してください。メソッド領域は、仮想マシンの起動時に作成されます。メソッド領域は論理的にヒープの一部ですが、単純な実装では、ガベージコレクションまたは圧縮のどちらも行わないことを選択できます。各ランタイム定数プールは、Java仮想マシンのメソッド領域から割り当てられます
Ravindra babu 2017年

確かに...私はそのペルミゲン空間(ヒープではない)の一部を読んでいますか?journaldev.com/2856/...

Oracleのドキュメントの信頼性が向上
Ravindra babu 2017年

若い世代のオブジェクトのしきい値は時間単位(msなど)で設定されていますか?またはGCラウンド?
非常に客観的な

16

Java仮想マシンは、若い世代、古い世代、永続的な世代の3つの世代に編成されています。ほとんどのオブジェクトは、最初は若い世代に割り当てられます。古い世代には、いくつかの若い世代のコレクションを生き延びたオブジェクトと、古い世代に直接割り当てられる可能性があるいくつかの大きなオブジェクトが含まれています。永続的な世代には、クラスとメソッドを記述するオブジェクトやクラスとメソッド自体など、JVMがガベージコレクターを管理するのに便利であると考えるオブジェクトが保持されます。


1

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.