JVM チューニングの概要: 新世代のガベージ コレクション アルゴリズム

JVM チューニングの概要: 新世代のガベージ コレクション アルゴリズム

ガベージコレクションのボトルネック

従来の世代別ガベージ コレクション方式では、ある程度、アプリケーションに対するガベージ コレクションの負担が最小限に抑えられ、アプリケーションのスループットが限界まで押し上げられていました。しかし、彼が解決できない問題の 1 つは、Full GC によって引き起こされるアプリケーションの停止です。リアルタイム要件が高い一部のアプリケーション シナリオでは、GC 一時停止によって発生する要求の蓄積と要求の失敗は許容されません。このようなアプリケーションでは、リクエストの戻り時間が数百ミリ秒、場合によっては数十ミリ秒以内であることが求められる場合があります。世代別ガベージ コレクション方式でこの指標を達成するには、最大ヒープ設定を比較的狭い範囲に制限することしかできません。ただし、これによりアプリケーション自体の処理能力が制限されるため、これも受け入れられません。

世代別ガベージ コレクション方式では、リアルタイム要件が考慮され、最大一時停止時間の設定をサポートする同時実行コレクターが提供されます。ただし、世代別ガベージ コレクションのメモリ パーティショニング モデルの制限により、その効果はあまり理想的ではありません。

リアルタイム要件を満たすために (実際、Java 言語の元の設計は組み込みシステムにも適用されていました)、短い一時停止時間と大きなメモリ空間の割り当ての両方をサポートする新しいガベージ コレクション メソッドが登場しています。従来の生成方法によって引き起こされる問題を効果的に解決できます。

増分収集の進化

増分コレクション方式は、従来の世代別方式によって発生する問題を理論的に解決できます。インクリメンタルコレクションは、ヒープスペースを一連のメモリブロックに分割します。使用時には、まずその一部が使用されます(すべてが使用されるわけではありません)。ガベージコレクション中、以前使用された部分の生き残ったオブジェクトは、最後にある未使用スペースに移動されます。これにより、使用しながらコレクションする効果が得られ、従来の世代別方法では、全体が使用された後に回復が中断される状況を回避できます。

もちろん、従来の世代別コレクション方式でも並行コレクションは提供されますが、ヒープ全体をメモリ ブロックとして扱うという致命的な欠陥があります。一方では、断片化が発生します (圧縮できません)。他方では、各コレクションはヒープ全体のコレクションであり、選択を行うことはできません。一時停止時間の制御は依然として非常に弱いです。インクリメンタル方式では、メモリ空間をブロックに分割することで上記の問題を解決できます。

ガーベッジファイアスト(G1)

この部分の内容は主にこちらを参考にしています。この記事はG1アルゴリズム論文の解釈です。何も追加しませんでした。

ターゲット

設計目標の観点から見ると、G1 は大規模なアプリケーションに完全に対応しています。

非常に高いヒープ スループットをサポート-- 複数の CPU とガベージ コレクション スレッドをサポート -- メイン スレッドが一時停止しているときに並列コレクションを使用 -- メイン スレッドの実行中に同時コレクションを使用リアルタイム目標: N ミリ秒以内に最大 M ミリ秒のガベージ コレクションを実行するように構成可能

もちろん、リアルタイム要件を満たすために、G1 では従来の世代リサイクル アルゴリズムに比べてパフォーマンスが多少低下します。

アルゴリズムの詳細な説明

G1は多くの企業の強みを学び、完璧を目指して努力してきたと言えます。増分コレクションを活用し、ヒープ全体を同じサイズの領域に分割します。メモリの回復と分割はリージョンに基づいています。同時に、CMS の特性も吸収し、ガベージ コレクション プロセスをいくつかの段階に分割して、ガベージ コレクション プロセスを分散します。さらに、G1 は世代別ガベージ コレクションの考え方にも賛同しており、異なるオブジェクトには異なるライフ サイクルがあり、異なる方法で収集できると考えています。そのため、世代別ガベージ コレクションもサポートしています。リサイクル時間の予測可能性を実現するために、G1 は領域をスキャンした後、その中のアクティブ オブジェクトのサイズをソートし、最初にアクティブ オブジェクトが小さい領域を収集して、スペースをすばやく再利用します (コピーするアクティブ オブジェクトが少ない)。アクティブ オブジェクトは小さいため、そのほとんどはガベージと見なすことができます。そのため、この方法は Garbage First (G1) ガベージ コレクション アルゴリズム、つまりガベージ優先コレクションと呼ばれます。

リサイクル手順:

初期マーキング

G1 は各領域に 2 つのマーキング ビットマップを保存します。1 つは前のマーキング ビットマップ、もう 1 つは次のマーキング ビットマップです。ビットマップには、オブジェクトの開始点を指すアドレス情報のビットが含まれています。

初期マーキングを開始する前に、まず次のマーキング ビットマップを同時にクリアし、すべてのアプリケーション スレッドを停止し、各領域でルートから直接アクセスできるオブジェクトをスキャンして識別し、領域のトップ値をマーク開始時の次のトップ (TAMS) に入れて、すべてのアプリケーション スレッドを再開します。

このステップの実行をトリガーする条件は次のとおりです。

G1 は、JVM ヒープ サイズのパーセンテージしきい値 h と、(1-h)*ヒープ サイズである別の H を定義します。現在、h の値は固定されていますが、G1 は将来的にこれを動的に変更し、JVM の動作に応じて動的に調整する可能性があります。世代モードでは、G1 は u とソフト リミットも定義し、ソフト リミットの値は Hu*ヒープ サイズです。ヒープで使用されるメモリがソフト リミット値を超えると、クリーンアップが完了した後、アプリケーションで許可されている GC 一時停止時間内にこのステップができるだけ早く実行されます。純粋モードでは、G1 はマーキングとクリーンアップでリングを形成し、クリーンアップがマーキング情報を十分に活用できるようにします。クリーンアップがリサイクルを開始すると、最初にメモリ スペースを最も多く使用できる領域がリサイクルされます。クリーンアップを複数回実行した後、スペースの少ない領域がリサイクルされると、G1 はマーキングとクリーンアップで構成される新しいリングを再初期化します。

同時採点

前回の初期マーキングによってスキャンされたオブジェクトは、これらのオブジェクトの基になるオブジェクトのアクティブ ステータスを識別するためにトラバースされます。この期間中にアプリケーション スレッドによって同時に変更されたオブジェクトの依存関係は、記憶セット ログに記録されます。新しく作成されたオブジェクトは、トップ値よりも高いアドレス範囲に配置されます。これらの新しく作成されたオブジェクトのデフォルト ステータスはアクティブであり、トップ値は同時に変更されます。

最終採点一時停止

アプリケーション スレッドの記憶セット ログがいっぱいでない場合は、いっぱいになった RS バッファーには格納されません。この場合、これらの記憶セット ログに記録されたカードの変更は更新されるため、この手順が必要になります。この手順で実行する必要があるのは、アプリケーション スレッドで記憶セット ログの内容を処理し、それに応じて記憶セットを変更することです。この手順では、アプリケーションを一時停止して並行して実行する必要があります。

ライブデータのカウントとクリーンアップ

G1 では、クリーンアップ ステップは必ずしも最終マーキング一時停止の実行後に実行されるわけではないことに注意してください。このステップではアプリケーションを一時停止する必要があるため、準リアルタイム要件を満たすには、G1 はユーザーが指定した最大 GC 一時停止時間に基づいてクリーンアップをいつ実行するかを適切に計画する必要があります。さらに、このステップの実行をトリガーする状況は他にもいくつかあります。

G1 はコピー方式を使用して収集し、その都度「to space」のスペースが十分であることを確認する必要があります。そのため、G1 が採用する戦略は、使用済みメモリ スペースが H に達したときに Cleanup ステップを実行することです。完全ヤング世代モードと部分ヤング世代モードの G1 では、Cleanup の実行をトリガーする状況もあります。完全ヤング モードでは、G1 はアプリケーションの許容可能な一時停止時間とヤング リージョンのリサイクルに必要な時間に基づいて、ヤング リージョンの数を推定します。JVM 内のオブジェクトに割り当てられたヤング リージョンの数がこの値に達すると、Cleanup が実行されます。部分ヤング モードでは、アプリケーションの許容可能な一時停止時間の範囲内で可能な限り頻繁に Cleanup が実行され、ヤングでないリージョンの Cleanup は最大限に実行されます。

見通し

将来的には、JVM のチューニングでは G1 アルゴリズムにさらに重点を置く必要があるかもしれません。

オリジナルリンク: http://pengjiaheng.iteye.com/blog/548472

【編集者のおすすめ】

  1. JVM チューニングの概要: 一般的な構成例
  2. JVM チューニングの概要: 世代別ガベージ コレクションの詳細
  3. JVM チューニングの概要: ガベージ コレクションが直面する問題
  4. JVM チューニングの概要: 基本的なガベージ コレクション アルゴリズム
  5. JVM チューニングの概要: いくつかの概念

<<:  簡単なアルゴリズムからアセンブリ言語の予備的研究

>>:  JVM チューニングの概要: 基本的なガベージ コレクション アルゴリズム

ブログ    
ブログ    
ブログ    

推薦する

...

人工知能は職場のつながりとコラボレーションを変革できる

世界の人工知能(AI)市場は2027年までに2,670億ドルに達すると予想されています。しかし、テク...

自然言語処理(NLP)はソーシャルエンジニアリング攻撃の解決に役立ちます

新しいツールは、件名や URL に基づいてソーシャル エンジニアリング攻撃を検出するのではなく、テキ...

Java プログラミング スキル - データ構造とアルゴリズム「シーケンシャル バイナリ ツリー」

基本概念データストレージの観点から見ると、配列ストレージとツリーストレージは相互に変換できます。つま...

Keras TensorFlow チュートリアル: 複雑なディープラーニング モデルをゼロから開発する方法

[[193126]] Keras は、独自のディープラーニング モデルを迅速に構築およびトレーニング...

7億7千万パラメータ、5400億PaLMを超えます! UW Google はトレーニング データの 80% のみを必要とする「ステップ蒸留」を提案 | ACL 2023

大規模言語モデルは優れたパフォーマンスを持ち、ゼロショットまたは少数ショットのプロンプトで新しいタス...

AIアートがブームになっていますが、今後はどうなるのでしょうか?

[[279415]]この記事のイラストはすべて、AIアートの第一人者であるドイツ人アーティスト、マ...

BaiduのHou Zhenyu氏:ビッグモデルがクラウドコンピューティングを再形成し、AIネイティブクラウドがクラウドコンピューティングの様相を変える

12月20日、2023年百度クラウドインテリジェンスカンファレンスおよびインテリジェントコンピューテ...

ソフトウェアプログラマー試験: 最もシンプルなコード実装による最速のソートおよび検索アルゴリズム

アルゴリズムの中心的な問題はソートと検索です。これら 2 つの分野は最も広く使用され、最も徹底的に研...

AI はビジネスのやり方を永久に変えるのでしょうか?

Google、Facebook、Twitterなど、世界中の大手テクノロジー企業が人工知能ソリュー...

物流の新たな勢いを刺激するGewutaiは、Anjiのインテリジェントマシンビジョンのスマート化を支援します

[[417396]]上海にある新エネルギー車を製造する全自動立体倉庫では、受注から製品出荷までの時間...

2020年にはAI技術はさらに環境に優しくなる

人工知能(AI)技術の環境への影響は最近、幅広い注目を集めていますが、これは今後10年間でAIの中心...

...

食べられる「論理ゲート」:科学者たちはデザートを「ミニコンピューター」に変えた

過去 10 年間で、食品業界では 3D プリント食品、食用センサー、ロボット調理、AR ダイニングな...