web-dev-qa-db-ja.com

若い世代、終身世代、パーマ世代

ヒープ、ヤング、Tenured、Perm生成と混同しています。

誰も説明してもらえますか?

60
Tony

JavaガベージコレクターはGenerational Garbage Collectorと呼ばれます。アプリケーション内のオブジェクトはさまざまな長さの期間存続します。ここでの重要な洞察は、短命オブジェクトと長命オブジェクトに異なるガベージコレクション戦略を使用すると、GCを各ケースに合わせて最適化できることです。

大まかに言って、オブジェクトはYoung Generationで繰り返されるガベージコレクションを「生き残る」ため、Tenured GenerationPermanent Generationは特別な場合で、JVMが必要とするオブジェクトを含みます。これらのオブジェクトは、プログラムで必ずしも表される必要はありません。クラスとメソッドを表します。

Young Generationには通常多くのゴミが含まれるため、多くの未使用オブジェクトを一度に取り除くために最適化されます。 Tenured Generationは、より長く存続するオブジェクトを含むため、大量のメモリを無駄にせずに高速なガベージコレクションに最適化されています。

ガベージコレクションテクノロジの改善により、詳細はかなり複雑になり、JVMとその構成方法によって異なります。何が起こっているのかを正確に知る必要がある場合は、使用している特定のJVMの documentation を読む必要があります。

とはいえ、これは概念レベルでまだ有用な単純な歴史的配置があります。歴史的に、Young Generationcopy collector およびTenured Generationbe mark and sweep collectorcopy collectorは、ガベージを取り除くためのCPUコストを本質的に支払わず、ほとんどのコストはライブオブジェクトの維持に費やされ、この効率の代償はより重いメモリです使用法。 マークとスイープコレクターは、ライブオブジェクトと未使用オブジェクトの両方にいくらかのCPUコストを支払いますが、メモリをより効率的に使用します。

72
Tendayi Mawushe

Javaヒープメモリは、オペレーティングシステムによってJVMに割り当てられたメモリの一部です。オブジェクトを作成するたびに、それらは Javaのヒープ 内に作成されます。

Javaヒープスペースは、Young Generation、OldまたはTenured Generation、およびPermanentと呼ばれるガベージコレクションのために、3つの領域または世代に分割されます世代。永続的な生成は、ホットスポットJVMでフルgc中にガベージコレクションされます

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

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

Permanent generationには、アプリケーションで使用されるクラスとメソッドを記述するためにJVMが必要とするメタデータが含まれます。永続世代は、アプリケーションで使用中のクラスに基づいて、実行時にJVMによって設定されます。

PermGenは、=からMetaspaceに置き換えられましたJava 8 release。PermSizeおよびMaxPermSizeパラメーターは現在無視されます。これをご覧ください dzone article byピエール-メタスペースについて理解するためのユグ・シャルボノー

enter image description here

画像ソース: http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html

詳細については、同じ記事を参照してください。

28
Ravindra babu

ヒープ内のすべてのオブジェクトは、参照されているときに存続します。それ以上ではない場合、ガベージコレクター(GC)はメモリを再利用します。

PermGen、Young、およびTenuredは、オブジェクト(またはヒープ内の可能なスペース)のさまざまな分類です。

PermGen:これらのオブジェクトは常にそこにあり、ガベージコレクションではありません。クラスオブジェクトがあり、インターンされた文字列など。そこにGCがあるかどうかはわかりません(システムがクラスをアンロードするとき...しかしそれは正常なことではありません)

Young:オブジェクトが作成されるとき、それはここにあります。

Tenured: N GCパスを生き残ったオブジェクトは、この分類/カテゴリに進みます(生き残り= GCパスですが、このオブジェクトは参照されているため、回収できません)。

使用するGCとパラメータ化に応じて、GCは多かれ少なかれ通過します。

その後、ガベージコレクションは、ヒープ内のオブジェクトを管理するためのさまざまなアプローチを持つことができます。オブジェクトのこの分類は、それを行うのに役立ちます。

7
helios

GCパラメータを調整/サイズ設定する方法に関する別の優れた(ただし長い)記事があります。

https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/

GCの問題があり、GCログの読み取り方法を知る必要がある場合、または現在のGCコレクターの動作を理解する必要がある場合に非常に役立ちます。

実行中のシステムのリモートモニタリングを接続して、リアルタイムのメモリ使用量とGCの実行を確認する場合は、このツールを確認してください。

http://Java.Sun.com/performance/jvmstat/visualgc.html

2
simonlord