JVMシリーズ(3):GCアルゴリズムガベージコレクター

JVMシリーズ(3):GCアルゴリズムガベージコレクター

[[204469]]

概要

ガベージコレクションは、通常「GC」と呼ばれます。1960年にMITのLisp言語で誕生しました。半世紀以上を経て、非常に成熟したものになりました。 JVM では、プログラム カウンター、仮想マシン スタック、ローカル メソッド スタックはすべてスレッドによって作成および破棄されます。メソッドの開始と終了時にスタック フレームがプッシュおよびポップされ、自動メモリ クリーンアップが実現されます。そのため、メモリ ガベージ コレクションは主に Java ヒープとメソッド領域に集中しています。プログラムの実行中、この部分のメモリの割り当てと使用は動的に行われます。

物体生存判定

オブジェクトが生きているかどうかを判断するには、一般的に 2 つの方法があります。

参照カウント: 各オブジェクトには参照カウント属性があります。新しい参照が追加されると、カウントが 1 増加します。参照が解放されると、カウントが 1 減少します。カウントが 0 の場合、リサイクルできます。この方法は単純ですが、オブジェクト間の循環参照の問題を解決することはできません。

到達可能性分析: GC ルートから下方向に検索を開始します。検索でたどられるパスは参照チェーンと呼ばれます。オブジェクトに GC ルートへの参照チェーンがない場合、そのオブジェクトは使用できないことが証明されます。到達不可能なオブジェクトです。

Java 言語では、GC ルートには次のものが含まれます。

  • 仮想マシン スタックで参照されるオブジェクト。
  • メソッド領域内のクラス静的属性エンティティによって参照されるオブジェクト。
  • メソッド領域内の定数によって参照されるオブジェクト。
  • ネイティブ メソッド スタック内の JNI によって参照されるオブジェクト。

ガベージコレクションアルゴリズム

マークアンドスイープアルゴリズム

「マークスイープ」アルゴリズムは、その名前が示すように、「マーキング」と「スイープ」の 2 つの段階に分かれています。まず、リサイクルが必要なすべてのオブジェクトがマークされ、マーキングが完了した後、マークされたすべてのオブジェクトがリサイクルされます。これが最も基本的なコレクションアルゴリズムと呼ばれる理由は、後続のコレクションアルゴリズムがこのアイデアに基づいており、その欠点を改善しているためです。

これには 2 つの主な欠点があります。1 つは効率の問題です。マーキングとクリアのプロセスの効率は高くありません。もう 1 つはスペースの問題です。マーキングとクリアの後、大量の不連続なメモリ フラグメントが生成されます。スペースの断片化が多すぎると、将来より大きなオブジェクトを割り当てる必要があるときにプログラムが十分な連続メモリを見つけられなくなり、事前に別のガベージ コレクション アクションをトリガーする必要が生じる可能性があります。

レプリケーションアルゴリズム

「コピー」コレクション アルゴリズムは、使用可能なメモリを容量に応じて 2 つの同じサイズのブロックに分割し、一度にそのうちの 1 つだけを使用します。このメモリ ブロックが使い果たされると、残っているオブジェクトが別のブロックにコピーされ、使用済みのメモリ領域がすぐにクリーンアップされます。

これにより、メモリの 1 つのブロックのみが毎回再利用されることが保証され、メモリを割り当てるときにメモリの断片化などの複雑な状況を考慮する必要がなくなります。ヒープの先頭ポインタを移動し、順番にメモリを割り当てるだけで済みます。これにより、実装が簡単になり、操作が効率的になります。このアルゴリズムの唯一のコストは、メモリが元のサイズの半分に削減され、長期間存続するオブジェクトを継続的にコピーすることで効率が低下することです。

マーク圧縮アルゴリズム

コピー収集アルゴリズムは、オブジェクトの生存率が高い場合、より多くのコピー操作を実行し、効率が低下します。さらに重要なのは、スペースの 50% を無駄にしたくない場合は、使用済みメモリ内のすべてのオブジェクトが 100% 有効であるという極端な状況に対処するために、割り当て保証のための追加のスペースが必要になるため、このアルゴリズムは古い世代では直接選択できないことです。

旧世代の特性に応じて、別の「マークコンパクト」アルゴリズムが提案されました。マーキングプロセスは「マークスイープ」アルゴリズムと同じですが、後続のステップはリサイクル可能なオブジェクトを直接クリーンアップするのではなく、生き残ったすべてのオブジェクトを一方の端に移動し、終了境界の外側のメモリを直接クリーンアップします。

世代別コレクションアルゴリズム

GC 生成の基本的な前提は、ほとんどのオブジェクトのライフサイクルは非常に短く、その存続時間も短いということです。

「世代別コレクション」アルゴリズムは、Java ヒープを新しい世代と古い世代に分割し、各世代の特性に応じて最も適切なコレクション アルゴリズムを使用できるようにします。新しい世代では、ガベージ コレクションを実行するたびに、多数のオブジェクトが消滅し、少数のオブジェクトのみが生き残っていることがわかります。この場合、コピー アルゴリズムが使用され、コレクションを完了するには、生き残っている少数のオブジェクトのコピー コストのみが必要です。古い世代では、オブジェクトの生存率が高く、割り当てるための追加のスペースがないため、リサイクルには「マークスイープ」または「マークコンパクト」アルゴリズムを使用する必要があります。

ガベージコレクター

コレクション アルゴリズムがメモリ回復の方法論である場合、ガベージ コレクターはメモリ回復の具体的な実装です。

シリアルコレクター

シリアル コレクターは、最も古く、最も安定しており、最も効率的なコレクターです。一時停止が長くなる可能性があり、リサイクルには 1 つのスレッドのみを使用します。新世代と旧世代はシリアルリサイクルを使用します。新世代のレプリケーションアルゴリズムと旧世代のマーク圧縮。ガベージコレクションプロセスは世界を停止します(サービス停止)

パラメータ制御: -XX:+UseSerialGC シリアルコレクター

ParNew Collector ParNew Collector は、実際には Serial Collector のマルチスレッド バージョンです。新世代の並列、旧世代の直列、新世代のレプリケーション アルゴリズム、旧世代のマーク圧縮

パラメータ制御:

-XX:+UseParNewGC ParNew コレクター

-XX:ParallelGCThreadsはスレッドの数を制限します

パラレルコレクター

Parallel Scavenge コレクターは ParNew コレクターに似ていますが、Parallel コレクターはシステムのスループットに重点を置いています。適応調整戦略はパラメータを通じてオンにすることができます。仮想マシンは、現在のシステム操作に基づいてパフォーマンス監視情報を収集し、これらのパラメータを動的に調整して、最適な一時停止時間または最大スループットを提供します。GC時間も、パラメータによって、特定のミリ秒数または割合を超えないように制御できます。新世代のレプリケーションアルゴリズム、旧世代のマーク圧縮

パラメータ制御: -XX:+UseParallelGC パラレルコレクター + 旧世代シリアルを使用

パラレルオールドコレクター

Parallel Old は、マルチスレッドと「マークスイープ」アルゴリズムを使用する Parallel Scavenge コレクターの旧世代バージョンです。このコレクターは JDK 1.6 でのみ使用可能でした。

パラメータ制御: -XX:+UseParallelOldGC パラレルコレクター + 旧世代パラレルを使用する

CMS コレクター

CMS (Concurrent Mark Sweep) コレクターは、コレクションの一時停止時間を最小限に抑えることを目的としたコレクターです。現在、多数の Java アプリケーションがインターネット サイトや B/S システムのサーバー側に集中しています。このようなアプリケーションは、サービスの応答速度に特に注意を払っており、システムのダウンタイムを最小限に抑えてユーザーに優れたエクスペリエンスを提供することを望んでいます。

名前(「マークスイープ」を含む)が示すように、CMS コレクターは「マークスイープ」アルゴリズムに基づいています。その操作プロセスは以前のコレクターよりも複雑です。全体のプロセスは、次の 4 つのステップに分かれています。

  • CMS初期マーク
  • 同時マーク(CMS同時マーク)
  • CMSコメント
  • 同時スイープ(CMS同時スイープ)

初期マーキングと再マーキングの 2 つのステップでは、依然として「Stop The World」が必要です。初期マーキングは、GC ルートに直接関連付けることができるオブジェクトのみをマーキングし、速度が非常に速いです。同時マーキング段階は、GC ルート トレースのプロセスであり、再マーキング段階は、同時マーキング中にユーザー プログラムが継続的に動作したためにマーキングが変更されたオブジェクトのマーキング レコードを修正することです。この段階の一時停止時間は、通常、初期マーキング段階よりもわずかに長くなりますが、同時マーキング時間よりもはるかに短くなります。

コレクター スレッドは、プロセス全体で最も長い並行マーキング プロセスと並行クリア プロセス中にユーザー スレッドと連携して動作できるため、CMS コレクターのメモリ回復プロセスは通常、ユーザー スレッドと同時に実行されます。旧世代のコレクター(新世代は ParNew を使用)

利点: 同時収集、低停止

デメリット: 大量のスペースフラグメントが生成され、同時フェーズによりスループットが低下する

パラメータ制御:

-XX:+UseConcMarkSweepGC CMSコレクターを使用する

-XX:+ UseCMSCompactAtFullCollection フルGC後にデフラグを実行します。デフラグプロセスは排他的であり、一時停止時間が長くなります。

-XX:+CMSFullGCsBeforeCompaction は、デフラグを実行する前に実行されるフルGCの数を設定します。

-XX:ParallelCMSThreads は CMS スレッドの数を設定します (通常は利用可能な CPU の数とほぼ同じです)

G1コレクター

G1 は、現在の技術開発における最先端の成果の 1 つです。HotSpot 開発チームは、将来的に JDK1.5 でリリースされた CMS コレクターを置き換えるという使命を G1 に与えています。 CMS コレクターと比較して、G1 コレクターには次の特性があります。

スペース統合: G1 コレクターは、メモリ スペースの断片化を生成しないマーク アンド スイープ アルゴリズムを使用します。大きなオブジェクトを割り当てる場合、連続したスペースが見つからないため、次の GC は事前にトリガーされません。

予測可能な一時停止は、G1 のもう 1 つの大きな利点です。一時停止時間の短縮は、G1 と CMS の共通の関心事ですが、一時停止時間の短縮を追求することに加えて、G1 は予測可能な一時停止時間モデルを確立し、ユーザーが N ミリ秒の時間セグメント内でガベージ コレクションに費やす時間が N ミリ秒を超えてはならないことを明示的に指定できるようにします。これは、リアルタイム Java (RTSJ) ガベージ コレクターの機能とほぼ同じです。

上記のガベージ コレクターは、新しい世代全体または古い世代全体を収集しますが、G1 ではそうではありません。 G1 コレクターを使用する場合、Java ヒープのメモリ レイアウトは他のコレクターのものと大きく異なります。Java ヒープ全体を、同じサイズの複数の独立した領域に分割します。新しい世代と古い世代の概念は保持されますが、新しい世代と古い世代は物理的に分離されなくなりました。どちらも、領域の一部 (連続していない場合もあります) の集合です。

G1の新世代収集はParNewと同様です。新世代の占有率が一定の割合に達すると収集が始まります。 CMS と同様に、G1 コレクターは古い世代のオブジェクトを収集するときに短い一時停止を行います。

収集手順:

1. マーキング フェーズ、最初に初期マーク (Initial-Mark) があり、このフェーズは一時停止され (Stop the World Event)、通常の Mintor GC がトリガーされます。対応する GC ログ: GC 一時停止 (young) (inital-mark)

2. ルート領域のスキャン: 残存領域 (古い世代に残存する領域) はプログラム実行中にリサイクルされます。このプロセスは、若い GC の前に完了する必要があります。

3. 同時マーキング: 同時マーキングはヒープ全体で実行されます (アプリケーションと並行して)。このプロセスは、若い GC によって中断される可能性があります。同時マーキング フェーズ中に、領域内のすべてのオブジェクトがガベージであることが判明した場合、その領域は直ちに再利用されます (図では X でマークされています)。同時に、同時マーキング プロセス中に、各領域のオブジェクト アクティビティ (領域内で存続しているオブジェクトの割合) が計算されます。

4. 注意:短い休止期間があります(STW)。再マーキング フェーズは、同時マーキング フェーズ (同時マーキング フェーズはアプリケーションと一緒に実行されます) によって生成された新しいガベージを収集するために使用されます。G1 は、CMS よりも高速な初期スナップショット アルゴリズムである snapshot-at-the-beginning (SATB) を使用します。

5. コピー/クリーンアップ、非アクティブなオブジェクトのマルチスレッドクリアにより STW が発生します。 G1 は、再利用された領域内のライブ オブジェクトを新しい領域にコピーし、Remember Sets をクリアし、再利用された領域を空にして空き領域リストに戻します。

6. コピー/クリア処理後。リサイクルエリア内のアクティブなオブジェクトは、濃い青と濃い緑の領域に集中しています。

よく使用されるコレクターの組み合わせ

[この記事は51CTOコラムニスト「Pure Smile」によるオリジナル記事です。転載の許可を得るにはWeChat公式アカウントを通じて著者に連絡してください]

この著者の他の記事を読むにはここをクリックしてください

<<:  コンピューターにビデオの字幕を認識させる

>>:  金融や視覚分野に加えて、AIはゲーム開発においても破壊的な技術となっている。

ブログ    
ブログ    

推薦する

EUがAIを活用して社会イノベーションを推進する方法

[[377176]] 2020年の新型コロナウイルスの世界的な蔓延は、人類にとって永遠の記憶となるこ...

科学的人工知能と疑似科学的人工知能を区別する方法

人工知能が進歩し続けるにつれて、研究者たちはその能力を向上させ、さまざまな分野で倫理的かつ責任を持っ...

上位985大学の「人工知能」関連学部・専攻一覧!ぜひ集めてみてください!

今最もホットな分野といえば、間違いなく「人工知能」でしょう。給与面でも人材ギャップの面でも、この分野...

Twitter が名前を X に変更し、マスク氏が X の世界を爆発させた! AIから宇宙探査まで、ユニバーサルアプリが形になりつつある

今、ボス・マーの「Xユニバース」がまた成長しました。それ以来、Twitter は単なるソーシャル ネ...

エッジコンピューティングと人工知能について知っておくべき7つのこと

エッジ コンピューティングと AI はどのように連携するのでしょうか? エッジ コンピューティングが...

ChatGPTを旅の途中のプロンプトジェネレーターに変える

ChatGPT は Midjourney 画像生成のテンプレートとして使用できると結論付けられました...

調査:CIOはAIの実験や投資に依然として慎重

機械学習の実験と成果の達成に関しては、持っている人と持っていない人の間の格差が拡大しています。先週ニ...

...

劉強東:AIは今後20年間ですべての産業を変革する中核的な力となる

1956年にアメリカのダートマス大学で開催された学術会議が、世界的なAI研究の始まりとなりました。 ...

人工知能の未来は人間・機械・環境のシステム知能である

軍事情報は戦争と同様、不確実性の多い霧です。予測不可能で、予測不可能です。現在の人工知能の発展傾向か...

半教師あり学習とその応用シナリオの簡単な分析

ラボガイドインターネットの発展により、企業はより多くのデータを入手できるようになりました。これらのデ...

会話型AI: パンデミック時代の最先端技術

パンデミックの発生により、世界中の労働システムが危険にさらされています。コンタクト センターの従業員...

人工知能が小売業界にどのような変化をもたらしているかをこの記事で学びましょう。2018年は新しい小売技術の元年になります

現代の小売業は第二次世界大戦後に始まりました。カルフールによるハイパーマーケット モデルの先駆的導入...

世界最高の AI 教育会社はどこでしょうか?米国、中国、欧州、イスラエルが先頭を走る

GoogleがモバイルファーストではなくAIファーストを語り、テンセントがAIをあらゆるものに取り入...