GCアルゴリズムについていくつか質問があります。まず、UseSerialGC、UseParallelGC、UseParallelOldGCなどのパラメーターを使用するときに、GCアルゴリズムを指定します。それらのすべてがすべての世代でGCを行うことができます、そうですか?
たとえば、「Java -XX:+ UseSerialGC」を使用すると、すべての世代でシリアルGCがGCアルゴリズムとして使用されます。
2番目に、旧世代でParallelGCを使用し、yong世代でSerialGCを使用できますか?
最後のタイトルとして、ParallelGCとParallelOldGCの違いは何ですか?
HotSpot VM Options を見てください。
-XX:+ UseParallelGC =スカベンジに並列ガベージコレクションを使用します。 (1.4.1で導入)。
-XX:+ UseParallelOldGC =完全なコレクションに並列ガベージコレクションを使用します。このオプションを有効にすると、-XX:+ UseParallelGCが自動的に設定されます。 (5.0 update 6で導入されました。)
ここでScavenges =若い世代のGC。
さて、たくさんの検索と研究の結果、私が理解するようになったのは以下の通りです、
-XX:+ UseParallelGC-これにより、GCでマルチスレッドを使用できるようになります若い世代ですが、古い/継続世代の場合でもシリアルマークおよびCompactアルゴリズムが使用されます。
-XX:+ UseParallelOldGC-これにより、GCでParallel Mark and Compactアルゴリズムをold/tenured生成で使用できるようになります。
理解しましょう-
若い世代で機能するアルゴリズムと、マークアンドコピー、スワップスペースなどのメモリ配置が旧世代で機能しない理由はさまざまです
死亡率が低い-旧世代では、「死亡率」は若い世代の死亡率よりも大幅に低くなっています。典型的なJavaアプリケーションでは、ほとんどのオブジェクトはすぐに死に、寿命はほとんどありません。若い世代で生き残り、古い世代に昇格したオブジェクトとして、これらのオブジェクトはより長い寿命を持つ傾向があります。これは、若い世代と比較して、古い世代の死亡率が非常に低くなることにつながります。
大幅にサイズ-古い世代は若い世代よりもかなり大きい。若い世代はすぐに片付けられるため、多くの短命なオブジェクト(小さな若い世代)に使用できるスペースは比較的少なくなります。旧世代では、オブジェクトは時間の経過とともに蓄積されます。したがって、若い世代(大きな古い世代)よりも古い世代の方がはるかに多くのスペースが必要です。
小さな割り当て-古い世代では、若い世代よりも割り当てが少なくなります。これは、古い世代では、ガベージコレクタが生き残ったオブジェクトを若い世代から古い世代に昇格させたときにのみオブジェクトが発生するためです。一方、若い世代では、アプリケーションが新規に生成するすべてのオブジェクト、つまり割り当ての大部分は、若い世代で発生します。
これらの違いを考慮に入れる、死亡率が高いため頻繁に呼び出す必要があるため、ガベージコレクションをできるだけ早く終了するアルゴリズムが若い世代に選択されました[ポイント(1) ]。さらに、アルゴリズムは、若い世代に多くが割り当てられるため、可能な限り最も効率的なメモリ割り当て[ポイント(3)]が可能であることを確認する必要があります。 Young Generationのマークアンドコピーアルゴリズムには、これらの特性があります。
一方、このアルゴリズムは旧世代では意味がありません。状況は異なります。ガベージコレクターは旧世代の多くのオブジェクトを処理する必要があり[ポイント(2)]、それらのほとんどはまだ生きています。ほんの一部だけが到達不能になり、解放できます[ポイント(1)]。ガベージコレクターがマークアンドコピーの場合と同様に、各ガベージコレクションに残っているすべてのオブジェクトをコピーする場合は、多くの時間を費やすことなく、コピーに多くの時間を費やします。
そのため、mark-and-sweepアルゴリズムは古い世代で作成され、何もコピーされませんが、到達できないオブジェクトが解放されます。このアルゴリズムはヒープの断片化につながるので、マークアンドスイープアルゴリズムのバリエーションを追加で検討しました。このアルゴリズムでは、スイープフェーズに続いて、圧縮が行われ、fragmentationとなります。削減されます。このアルゴリズムはmark-and-compactアルゴリズムと呼ばれます。
A マークとコンパクトアルゴリズムは、ステージをたどってオブジェクトグラフをトラバースする必要があるため、時間がかかる可能性があります。
新しい場所の計算フェーズでは、フリースペースを取得するたびに、このスペースに移動できるオブジェクトを見つけようとします(デフラグメンテーション)。後のフェーズで使用するためにペアを保存します。これにより、アルゴリズムはより多くの時間を消費します。
マークアンドコンペアは、テニュア世代に固有のいくつかの問題を解決しますが、これはSTW(Stop the world)イベントであり、多くの時間を消費し、アプリケーションに深刻な影響を与える可能性があるため、いくつかの深刻な問題を抱えています。
旧世代の代替アルゴリズム
ブレークタイムを短縮するために、シリアルマークアンドコンパクトアルゴリズムの代替案が検討されています。
並列マークアンドコンパクトすべてのアプリケーションスレッドをラッチするが、複数のガベージコレクタスレッドを使用したラベル付けとその後の圧縮を処理するアルゴリズム。これはまだ世界一のアプローチですが、マルチコアまたはマルチプロセッサマシンでは、シリアルマークアンドコンパクトアルゴリズムよりも一時停止が短くなります。この旧世代の並列アルゴリズム(「ParallelOld」と呼ばれます)は、Java 5 Update 6)から使用でき、オプション-XX:+ UseParallelOldGCで選択されています。
競合するmark-and-sweepスレッドを停止することなく、少なくとも部分的にアプリケーションに匹敵するアルゴリズムであり、時々、短い世界停止フェーズが必要です。この並行マークアンドスイープアルゴリズム(「CMS」と呼ばれます)は、Java 1.4.1;以降、オプション-XX:+ UseConcMarkSweepGCでオンに切り替えられます。マークアンドスイープアルゴリズム。圧縮は行われず、すでに説明されているフラグメンテーションの問題が発生します。
つまり、一言で言えば-XX:+ UseParallelOldGCは、Mark and Compactアルゴリズムを使用してメジャーコレクションを実行しているときに複数のスレッドを使用するための指標として使用されます。これが代わりに使用される場合、マイナーまたは若いコレクションは並列ですが、メジャーコレクションは依然としてシングルスレッドです。
私はこれが答えることを望みます。
OracleからJava SE 8ドキュメント:
https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html
並列コレクター(スループットコレクターとも呼ばれます)は、マイナーコレクションを並列で実行するため、ガベージコレクションのオーバーヘッドを大幅に削減できます。これは、マルチプロセッサまたはマルチスレッドハードウェアで実行される中規模から大規模のデータセットを使用するアプリケーションを対象としています。パラレルコレクターは、特定のハードウェアおよびオペレーティングシステムの構成でデフォルトで選択されるか、オプション-XX:+ UseParallelGCで明示的に有効にすることができます。
並列圧縮は、並列コレクターが主要なコレクションを並列で実行できるようにする機能です。並列圧縮を使用しない場合、メジャーコレクションは単一のスレッドを使用して実行されるため、スケーラビリティが大幅に制限される可能性があります。オプション-XX:+ UseParallelGCが指定されている場合、並列圧縮はデフォルトで有効になります。オフにするオプションは-XX:-UseParallelOldGCです。
したがって、-XX:+ UseParallelGCを指定すると、デフォルトでは、メジャーコレクションも複数のスレッドを使用して実行されます。逆も当てはまります。つまり、-XX:+ UseParallelOldGCを指定すると、マイナーコレクションも複数のスレッドを使用して行われます。
これらは、a Javaヒープ、つまり新世代と旧世代の異なる領域に適用される2つのgcポリシーです。他のオプションを意味するオプションを明確にするのに役立つリンクがあります。特に何を理解し始めたときに役立つでしょうたとえば、ParallelOldGCまたはParNewGCを指定すると表示されます http://www.fasterj.com/articles/oraclecollectors1.shtml