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はゲーム開発においても破壊的な技術となっている。

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

人工知能が買い物をより簡単にする

[51CTO.comより] 中国共産党第19回全国代表大会で「インターネット、ビッグデータ、人工知能...

R言語におけるAprioriアルゴリズムの応用

[[193979]] I. コンセプト関連性分析は、大規模なデータセットに隠された意味のあるつながり...

...

米メディア:人工知能の発展には5つの大きなトレンドが予想される

3月15日、アメリカの隔週刊ウェブサイト「フォーブス」は「2021年の人工知能:期待できる(または期...

機械学習におけるモデルドリフト

今日、機械学習モデルはビジネス上の意思決定の主な原動力となっています。他のビジネス戦略と同様に、これ...

システム統合における10の将来のトレンド

システム統合は、ソフトウェア システム、情報システム、エンタープライズ システム、モノのインターネッ...

人工知能に関する究極の議論: 私たちは AI なのか?

有名な科学者ホーキング博士の死からわずか半年後に、世界で最も聡明な科学者たちが歴史的な議論を始めると...

スタンフォード大学とOpenAIがメタプロンプティングを提案し、最も強力なゼロショットプロンプティング技術が誕生した。

最新世代の言語モデル (特に GPT-4、PaLM、LLaMa) は、自然言語処理と生成の限界を押し...

ついに、トップNLPカンファレンスACLへの投稿は匿名である必要がなくなりました

自然言語処理分野の研究者にとって朗報があります。最近、計算言語学会(ACL)の年次総会は、この一連の...

AIがCIOの役割をどう変えるのか

破壊的技術により、CIO はこれまで以上に重要な役割を果たすようになっています。 CIO の役割は長...

Googleがこれまでで最も強力なAIモデル「Gemini」を発表

グーグルは水曜日、AIを収益化する方法に対する回答を求める圧力が高まる中、同社がこれまでで最も強力だ...

...

2021年4月のドローン業界の重要な動向の概要

2021年3月に入り、ドローン業界では新製品の登場、用途の深化、大きな出来事の連続など、発展は活気に...

モノのインターネット – インド国防軍にとっての可能性

世界がインダストリー4.0へと向かうにつれ、モノのインターネットへの世界的な支出は2022年までに1...