ホームページ  >  記事  >  Java  >  JVM メモリ管理-----洗練されたガベージ コレクター (ガベージ コレクターの世界で簡単にプレイできるようになります)

JVM メモリ管理-----洗練されたガベージ コレクター (ガベージ コレクターの世界で簡単にプレイできるようになります)

黄舟
黄舟オリジナル
2016-12-28 15:51:341124ブラウズ

はじめに

前の章では、ホットスポットでのガベージ コレクターの実装について説明しました。合計 6 つの実装と 6 つの組み合わせがあります。今回は、LZ がこれら 6 人のコレクターそれぞれの力とその組み合わせの力についてお話します。
誰もが閲覧して比較できるようにするために、LZ は、特定のコレクターに焦点を当ててデザイン パターンを作成するときに使用した方法を使用して、これらのコレクターをいくつかの次元で説明することにしました。

クライアント モードとサーバー モード

この章の内容を紹介する前に、JVM の 2 つのモードについて説明します。1 つはクライアント モード、もう 1 つはサーバー モードです。通常、開発に使用するモードはデフォルトでクライアント モードです。コマンド ライン パラメータ -server を使用してサーバー モードを強制的にオンにすることもできます。この 2 つの最大の違いは、JVM がサーバーで多くの最適化を行っていることです。モード。
サーバー モードの JAVA アプリケーションは起動が遅くなりますが、サーバー モードの JVM の最適化により、プログラムを長時間実行すると実行速度がどんどん速くなります。逆に、クライアント モードの JAVA アプリケーションは起動が早いものの、実行時間が長い場合はサーバー モードに比べてパフォーマンスが大幅に低下します。

コレクターの詳細な説明

ここで、最初に単一のガベージコレクターの関連内容について説明し、最後に、組み合わせ後の各組み合わせの特徴について簡単に説明します。

シリアルガベージコレクター

アルゴリズム:コピーアルゴリズムを使用
メモリ領域:新世代向けに設計
実行方法:シングルスレッド、シリアル
実行プロセス:新世代のメモリが足りない場合、まずすべてのユーザープログラムを一時停止し、その後GC を開始する スレッドはコピー アルゴリズムを使用してガベージをリサイクルします。 特徴: シングル スレッド操作とユーザー プログラムは GC フェーズ全体で一時停止する必要があるため、アプリケーションは一時停止します。長い間使用されますが、小規模なプログラムには非常に適しています。
適用可能なシナリオ: 日常的な開発とプログラムの使用のデバッグ、およびデスクトップ アプリケーションの対話型プログラム。
オープンパラメーター: -XX:+UseSerialGC (クライアント モードのデフォルト値)

シリアル オールド ガベージ コレクター

ここでは、シリアル オールド コレクターの各ディメンションの特性をリストしません。これは、シリアル コレクターと同じであるため、違いは、古い世代向けに設計されているため、マーキング/照合アルゴリズムが使用されていることです。残りの寸法特性については、シリアル オールドはシリアル コレクターとまったく同じです。

ParNewガベージコレクター

アルゴリズム:コピーアルゴリズムを使用
メモリ領域:新世代向けに設計
実行方法:マルチスレッド、並列
実行プロセス:新世代のメモリが足りない場合、まずすべてのユーザープログラムを一時停止し、次に、複数の GC を開始します。 このプロセス中に、スレッドはコピー アルゴリズムを使用してガベージ コレクションを並行して実行します。 特徴: マルチスレッドを使用して並行して実行されるため、その数に影響を受けます。システム内に少なくとも 1 つ以上のコア プロセッサが必要です。プロセッサ、複数のスレッドを開くプロセッサの数 (ただし、スレッドの数はパラメータ -XX:ParallelGCThreads= を使用して制御できます)。マルチコアおよびマルチプロセッサ システムに適しています。ユーザー プログラムは GC フェーズ全体で一時停止する必要がありますが、マルチスレッドの並列処理により長時間の一時停止が発生することはありません。したがって、スループットの点では、ParNew の方がシリアルよりも優れています。プロセッサの数が増えるほど、その効果はより顕著になります。ただし、これは絶対的なものではありません。単一プロセッサの場合、並列実行 (同期など) のオーバーヘッドにより、ParNew のパフォーマンスはシリアル コレクターよりも低くなります。シングルプロセッサ使用時だけでなく、それよりも容量の小さいヒープを使用した場合や、プロセッサを 2 個使用した場合でも、ParNew のパフォーマンスがシリアルよりも高いとは限りません。
適用可能なシナリオ: 中規模から大規模のヒープで、システムに少なくとも 1 つ以上のプロセッサーがある
有効なパラメーター: -XX:+UseParNewGC

パラレル スカベンジ ガベージ コレクター

このコレクターは ParNew とほぼ同じで、両方とも新世代設計、レプリケーションアルゴリズムを使用した並列コレクター。 ParNew との最大の違いは、設定できるパラメーターが異なることで、GC の一時停止時間とスループットをより正確に制御できるようになります。
並列スカベンジ コレクターによって提供されるパラメーターには、主に最大一時停止時間の制御 (-XX:MaxGCPauseMillis= を使用) とスループットの制御 (-XX:GCTimeRatio= を使用) が含まれます。このことから、パラレル スカベンジはスループット制御を提供するコレクターであることがわかります。
ただし、最大休止時間が短いほど良い、またはスループットが大きいほど良いとは考えないでください。パラレル スカベンジ コレクターを使用する場合、最大休止時間、スループット、最小値という 3 つの主要なパフォーマンス指標があります。新しい世代の価値。
並列スカベンジ コレクターには、対応する調整戦略があり、最大休止時間、次にスループット、最後に新しい世代領域の最小値の目標を満たすことが優先されます。
したがって、最大停止時間を短く設定しすぎると、利己的な欲求を満たすために全体のスループットと新しい世代のサイズが犠牲になります。手のひらや手の甲には肉が詰まっているので、これはやめたほうがいいでしょう。ただし、パラレル スカベンジには、パラレル スカベンジ コレクターがメモリ領域サイズの調整を完全に引き継ぐことができるパラメーターがあります。これには、古い世代への昇格の期間も含まれます (-XX:MaxTenuringThreshold=n を使用して調整できます)。つまり、-XX: UseAdaptiveSizePolicy を使用すると、メモリ領域サイズの適応ポリシーがオンになります。
パラレル スカベンジ コレクターは、パラメーター -XX:+UseParallelGC を使用してオンにすることができます。これは、サーバー モードのデフォルトの新世代コレクターでもあります。

パラレル オールド ガベージ コレクター

パラレル オールドと ParNew または Parallel Scavenge の関係は、シリアルとシリアル オールドに似ています。ただし、パラレル オールドが古い世代向けに設計されたパラレル コレクターである点が異なります。マーキング/照合アルゴリズムを使用します。
パラレル オールド コレクターのもう 1 つの重要な意義は、パラレル オールド コレクターがパラレル スカベンジで動作できる唯一の旧世代コレクターであることです。したがって、シリアル オールドがパラレル スカベンジの制御可能なスループットの評判に影響を与えるのを防ぐために、パラレル オールドは機能します。パラレルスカベンジの真のパートナーとして。
パラメーター -XX:-UseParallelOldGC を使用してオンにできますが、JDK6 以降では、パラレル スカベンジをオンにした後のデフォルトの古い世代のコレクターでもあります。

コンカレント マーク スイープ ガベージ コレクター

コンカレント マーク スイープ (以下、CMS) コレクターは、アプリケーションと GC スレッドが連携して動作するように真に実装される唯一のものです (連携することは顧客のためですが、必ずしも連携する必要はありません)。交互)コレクター。
CMS は旧世代向けに設計されたコレクターであり、マーク/クリア アルゴリズムを使用します。また、旧世代でマーク/クリア アルゴリズムを使用する唯一のコレクターでもあります。
マーク/クリアアルゴリズムは4段階に分かれた特殊な処理方法を採用しています。
1. 初期マーキング: アプリケーションを一時停止し、残っているオブジェクトをすばやくマークする必要があります。
2. 同時マーキング: アプリケーションを復元し、GC ルートを同時に追跡します。
3. 再マーク: アプリケーションを一時停止し、追跡で見逃したオブジェクトを再マークする必要があります。
4. 同時クリア: アプリケーションを復元し、マークされていないガベージ オブジェクトを同時にクリアします。
これは、元のマーク/クリア アルゴリズムよりも少し複雑で、主に同時マーキングと同時クリアの 2 つのフェーズに現れ、これら 2 つのフェーズは GC フェーズ全体の中で最も時間がかかるフェーズでもあります。 2 つのフェーズはアプリケーションと同時に実行されるため、CMS コレクターによって発生する一時停止時間は非常に短くなります。これは比較的理解しやすいです。
ただし、その欠点については簡単に述べておく必要があります。主な欠点は次のとおりです。

1. GCスレッドとアプリケーションプログラムが同時に実行されるとCPUリソースを占有するため、全体のスループットが低下します。言い換えれば、スループット指標の観点から見ると、CMS コレクタは並列スカベンジ コレクタよりも弱いということです。ここで LZ は、Oracle 公式 Web サイトから CMS の説明を抜粋し、CMS のパフォーマンスと CPU の数の関係について述べています。
同時フェーズではガベージ コレクションに少なくとも 1 つのプロセッサが使用されるため、通常、同時コレクタはユニプロセッサ (シングルコア) マシンでは何の利点も提供しません。ただし、システムで短い一時停止を実現できる別のモードが利用可能です。プロセッサーが 1 つまたは 2 つしかありません。詳細については、以下のインクリメンタル モードを参照してください。

LZ の英語は非常に平均的です (恥ずかしながら、レベル 4 に合格していません、0.0)。しかし、ツールの助けを借りて、これの意味を大まかに翻訳できます。経過は以下の通り。
中国語の要点: 同時フェーズのガベージ コレクションでは少なくとも 1 つのプロセッサが使用されるため、単一のプロセッサで同時コレクタを使用しても何のメリットも得られません。ただし、1 つまたは 2 つのプロセッサ システムで効果的に短い一時停止を実現する独立した方法があります。詳細については、以下のインクリメンタル モードを参照してください。
明らかに、Oracle のドキュメントでは、単一プロセッサの場合、同時コレクタがプロセッサのプリエンプションによりパフォーマンスの低下を引き起こすと指摘しています。最後に、インクリメンタル モードの対処方法が示されていますが、書籍「JAVA 仮想マシンの徹底理解」では、インクリメンタル モードは非推奨と定義されていると指摘されています。 LZ が抜粋した公式の紹介文は JDK5.0 の紹介に基づいており、書籍「JAVA 仮想マシンの徹底理解」では JDK6.0 のバージョンが言及されているため、LZ はインクリメンタル モードが JDK6 にあると暫定的に推測します。 0 リリース時に放棄されましたが、この放棄の時間やバージョンは実際には重要ではなくなりました。
2. マーク/クリアの大きな欠点は、メモリの断片化の存在です。したがって、JVM は、グローバル GC (フル GC) の後にデフラグを実行するための -XX:+UseCMSCompactAtFullCollection パラメーターを提供します。各グローバル GC 後のデフラグは一時停止時間に大きく影響するため、JVM は、一時停止時間を制御するためのパラメーター -XX:CMSFullGCsBeforeCompaction も提供します。数回のグローバル GC 後のデフラグ。
3. CMS の最後の欠点には、同時モード障害という用語が含まれます。これがこの用語の公式の説明です。
Tenured 世代がいっぱいになる前にコンカレント コレクタが到達不能オブジェクトの再利用を完了できない場合、または Tenured 世代の使用可能な空き領域ブロックで割り当てを満たすことができない場合、アプリケーションは一時停止され、収集はすべてのデータで完了します。アプリケーション スレッドが停止しました。コレクションを同時に完了できないことは、コンカレント モードの失敗と呼ばれ、コンカレント コレクターのパラメーターを調整する必要があることを示します。
中国語の意味: コンカレント コレクターが、古い世代がいっぱいになる前に到達不可能なものを完了できない場合) オブジェクトのリサイクル、または古い世代の有効な空きメモリ領域が特定のメモリ割り当て要求を満たすことができない場合、アプリケーションは一時停止され、この一時停止中にガベージ コレクションが開始され、リサイクルが完了するまでアプリケーションは再開されません。このように収集を同時に完了できないことをコンカレント モードの失敗と呼びます。この状況が発生するということは、コンカレント コレクタのパラメータを調整する必要があることも意味します。
上記の 2 つの状況は少し繰り返しているように思えますが、古い世代がいっぱいになる前にオブジェクトのリサイクルを完了できなかったためにメモリ割り当て要求が満たされなかったことが原因ではないでしょうか。ここでの
LZ の個人的な理解は、古い世代がいっぱいになる前にオブジェクトのリサイクルを完了できないということは、同時クリア段階で古い世代が時間内にクリアされず、その結果、空きメモリが不足することを意味するということです。メモリ割り当て要求を満たすことができないとは、主に、新しい世代が古い世代に昇格するときに、古い世代のメモリ フラグメントが多すぎるため、連続したメモリがないために一部の割り当てを満たすことができないという事実を指します。
実際、同時モードが失敗した場合、シリアル オールドはグローバル GC (フル GC) を実行するための代替コレクターとして使用されるため、シリアル オールドは CMS の「代替」とみなすこともできます。当然、シリアルオールドの介入により、大きな休止時間が発生します。
同時モードの失敗を可能な限り回避するために、-XX:CMSInitiatingOccupancyFraction= パラメーターを調整して、古い世代のメモリ使用量がどの程度 (N%) に達するかを制御してから、同時実行コレクターを開始します。古い世代をリサイクルします。

組み合わせの力

上記で各コレクターの特徴を簡単に紹介しました。以下では、LZ が 3 つの典型的な組み合わせを紹介します。他の 3 つの組み合わせは一般的には使用されません。

シリアルと古いシリアル

この組み合わせは、最も一般的な組み合わせの 1 つであり、クライアント モードのデフォルトのガベージ コレクターの組み合わせでもあり、パラメーター -XX:+UseSerialGC を使用して強制的にオンにすることもできます。
実装が比較的簡単で、追加のスレッド関連のオーバーヘッド (主にスレッドの切り替えと同期) がないため、クライアント PC 上で実行される小規模なアプリケーションやデスクトップ アプリケーション (Swing で記述されたユーザー インターフェイス プログラムなど) に非常に適しています。通常の開発、デバッグ、テストなど。
上記の 3 つの状況にはすべて共通の特徴があります。
1. これらはすべて PC 上で実行されるため、一般に構成が高すぎたり、プロセッサの数が多すぎたりすることはありません。
2. 上記の状況では、アプリケーションは長時間実行されません。
3. スケールはあまり大きくなりません。つまり、ヒープは比較的小さく、コレクションは比較的速く、一時停止時間は比較的短くなります。

パラレル スカベンジ & パラレル オールド

結局のところ、この組み合わせは私たちにとっては一般的ではありませんが、高いスループットまたは一時停止時間を必要とする組み合わせです。この組み合わせは、サーバー モード (JDK6 以降) のデフォルトの組み合わせです。もちろん、-XX:+UseParallelGC パラメーターを使用して強制的にオンにすることもできます。
この組み合わせでは、新世代と旧世代の両方で並列収集が使用されるため、一時停止時間が短くなり、システム全体のスループットが高くなります。これは、長時間実行する必要があり、スループットに特定の要件がある一部のバックグラウンド プログラムに適しています。
バックグラウンドで実行されるこれらのプログラムには次の特徴があります。
1. システム構成は比較的高く、通常は少なくとも 4 コア (現在のハードウェア レベルに基づく) です。
2. スループット要件が高いか、一定の量に達する必要があります。
3. アプリケーションの実行に時間がかかります。
4. アプリケーションのサイズは大きく、通常は中規模から大規模のヒープです。

ParNew と CMS (代替としての Serial Old)

この組み合わせは、上記の並列組み合わせと同様、日常の開発では一般的ではなく、高い応答時間を必要とするアプリケーションの最初の選択肢です。この組み合わせは、パラメーター -XX:+UseConcMarkSweatGC を使用して有効にする必要があります。
この組み合わせは新世代の並列コレクターを使用するため、新世代の GC 速度は非常に速く、一時停止時間は非常に短くなります。若い世代の GC は同時コレクションを使用します。ガベージ コレクション時間の大部分では、GC スレッドがアプリケーションと同時に実行されるため、一時停止時間は依然として非常に短いです。これは、長時間実行する必要があり、対応する時間に特定の要件がある一部のバックグラウンド プログラムに適しています。
バックグラウンドで実行されるこれらのプログラムの特性は、並列モードのバックグラウンド プログラムと非常に似ています。違いは 2 番目の点です。ParNew と CMS の組み合わせを使用するバックグラウンド アプリケーションには、通常、応答時間に関する特定の要件があります。私たちのWEBアプリケーション。

結論

今回LZは各コレクターの特徴と各組み合わせの特徴を整理しました。また、LZがここで言及していない残りの3つの組み合わせは、その理由が特に一般的ではない、または使用される可能性があるためです。これら 3 つの組み合わせはすべて、人々に異なる感覚を与え、その効果は確かに良くありません。
この記事が少しでもお役に立てれば幸いです、ご覧いただきありがとうございます。

上記は、JVM メモリ管理の内容です -- ガベージ コレクターの改良 (ガベージ コレクターの世界で簡単に遊べるようにします) さらに関連した内容については、PHP 中国語 Web サイト (www) に注目してください。 .php.cn )!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。