JVM の 3 色マーキングと読み取り/書き込みバリア

JVM の 3 色マーキングと読み取り/書き込みバリア

この記事は、Lao Zheng 氏が執筆した WeChat パブリックアカウント「運用と保守の開発ストーリー」から転載したものです。この記事を転載する場合は、Operation and Maintenance Development Story のパブリック アカウントにお問い合わせください。

3色ラベル

GC ガベージ コレクターの主な目的は、メモリのリサイクルを実現することです。このプロセスの主な 2 つのステップは、メモリのマーキングとメモリのリサイクルです。

3色ラベリング法の紹介

3 色マーキング方式は、主に再利用できるメモリ ブロックを効率的にマーキングするために使用されます。

3色マーキングは推理を補助するツールとして使用されます。オブジェクト グラフのトラバース中に検出されたオブジェクトは、「訪問されたかどうか」という条件に応じて、次の 3 つの色でマークされます。

  • 白: オブジェクトがガベージ コレクターによってまだアクセスされていないことを示します。明らかに、到達可能性分析の開始時には、すべてのオブジェクトは白です。分析の最後にまだ白いオブジェクトが残っている場合、それらは到達不可能であることを意味します。
  • 黒: オブジェクトがガベージ コレクターによってアクセスされ、オブジェクトへのすべての参照がスキャンされたことを示します。黒い物体はスキャンされており、安全です。他のオブジェクトが黒いオブジェクトを参照している場合は、再度スキャンする必要はありません。黒い物体が(灰色の物体を通過せずに)白い物体を直接指すことは不可能です。
  • 灰色: オブジェクトがガベージ コレクターによってアクセスされたが、スキャンされていないオブジェクトへの参照が少なくとも 1 つあることを示します。

3色マーキング工程

マーキングプロセス:

  1. GC の同時実行が開始されると、すべてのオブジェクトは白になります。
  2. GC ルートによって直接適用されたすべてのオブジェクトをグレー コレクションとしてマークします。
  3. グレー セット内のオブジェクトにサブ参照がないと判断された場合、そのオブジェクトはブラック セットに配置されます。サブ参照オブジェクトがある場合、そのすべてのサブ参照オブジェクトがグレー セットに格納され、現在のオブジェクトがグレー セットに配置されます。
  4. この手順 3 などを実行し、グレー セット内のすべてのオブジェクトが黒に変わるまで続けます。これでマーキングのこのラウンドが完了し、白のセット内のオブジェクトは到達不能オブジェクト、つまりガベージ オブジェクトと呼ばれます。
  5. マークを付けた後、白いオブジェクトは到達不可能な GC ルートとなり、ガベージ コレクションの対象になります。

誤った表示

誤表示とは何ですか?誤った表示は、次の両方の条件が満たされた場合に発生します。

評価者は、黒いオブジェクトから白いオブジェクトへの 1 つ以上の参照を挿入します。

評価者は、灰色のオブジェクトから白いオブジェクトへのすべての直接または間接の参照を削除します。

誤表示に対する解決策

誤ったラベル付けの問題を解決するには、これら 2 つの条件のいずれかを破るだけで済みます。解決策は 2 つあります: 増分更新と Snapshot At The Beginning (STAB)。

増分更新

増分更新により最初の条件が破棄されます。黒いオブジェクトが白いオブジェクトを指す新しい参照関係を挿入すると、新しく挿入された参照が記録されます。同時スキャンが完了したら、記録された参照関係の黒いオブジェクトをルートとして使用して再度スキャンします。これを簡略化すると、白いオブジェクトへの新しい参照が黒いオブジェクトに挿入されると、灰色のオブジェクトに戻ることを意味します。

オリジナルスナップショット(STAB)

元のスナップショットは 2 番目の条件を破棄します。灰色のオブジェクトが白いオブジェクトを指す参照関係を削除したい場合、削除する参照が記録されます。同時スキャンが完了したら、記録された参照関係内の灰色のオブジェクトがルートとして使用され、再度スキャンされます。これを簡略化すると、参照関係が削除されているかどうかに関係なく、スキャンが開始された瞬間のオブジェクト グラフ スナップショットに従って検索が実行されることになります。

欠落と過剰入札

実際には、誤ったラベル付けには、ラベルの欠落とラベルの重複の 2 種類があります。

マルチスタンダード - 浮遊ゴミ

マークがEに実行されると、この時点でobject.E = nullが実行される

現時点では、E/F/G は理論的にはリサイクル可能です。しかし、E は灰色に変わったため、実行は続行されます。最終結果として、それらはガベージ オブジェクトとしてマークされず、このマーク ラウンドを生き残ります。このラウンドでリサイクルされるはずのゴミがリサイクルされず、この部分を「浮遊ゴミ」と呼びます。浮遊するゴミはプログラムの正確性に影響を与えません。この「ガベージ」は、次のガベージ コレクションがトリガーされたときにのみクリーンアップされます。また、マーキング プロセス中に生成された新しいオブジェクトは、デフォルトでは黒でマークされますが、マーキング プロセス中に「ゴミ」になる可能性があります。これも浮遊ゴミの一部と考えられます。

ラベルがありません - 読み取り/書き込みバリア

店舗バリア

オブジェクトのメンバー変数に値を割り当てる場合、基礎となるコードは次のようになります。

  1. /**
  2. * @param フィールドメンバーオブジェクトの属性
  3. * @param new_value 新しい値、例: null  
  4. */
  5. void oop_field_store(oop* フィールド、oop new_value) {
  6. *field = new_value // 代入演算
  7. }

いわゆる書き込みバリアは、実際には割り当て操作の前後に何らかの処理ロジックを追加するものです(AOPに似ています)

  1. void oop_field_store(oop* フィールド、oop new_value) {
  2. pre_write_barrier(フィールド); // 書き込みバリア - 書き込み前バリア
  3. *field = new_value // 代入演算
  4. pre_write_barrier(フィールド); // 書き込みバリア - 書き込み後バリア
  5. }

書き込みバリア + SATB

オブジェクト E のメンバー変数の参照が変更された場合 (objE.fieldG = null;)、書き込みバリアを使用して、E の元のメンバー変数の参照オブジェクト G を記録できます。

  1. void pre_write_barrier(oop* フィールド) {
  2. oop old_value = *フィールド; // 古い値を取得する
  3. remark_set.add (古い値) // 元の参照オブジェクトを記録する
  4. }

[元のメンバー変数の参照が変更される前に、元の参照オブジェクトを記録する] このアプローチの考え方は、最初のオブジェクト グラフ、つまり元のスナップショット (Snapshot At The Beginning、SATB) を保持しようとすることです。ある瞬間の GC ルートが決定されると、その時点のオブジェクト グラフはすでに決定されます。たとえば、その時点で D が G を参照していた場合、後続のマーキングもその瞬間のオブジェクト グラフに従う必要があります (D は G を参照していました)。期間が変更された場合、これを記録して、マークアップが元のビューに従って維持されるようにすることができます。すべての GC ルートをスキャンする操作 (つまり、初期マーキング) には通常 STW が必要であることに注意してください。そうでない場合、同時実行中に新しい GC ルートが追加される可能性があるため、操作が完了しない可能性があります。

SATB は条件 1: [灰色のオブジェクトが白いオブジェクトの参照を切断する] を破り、ラベルが欠落しないことを保証します。

ちょっとした最適化: ガベージ コレクションの同時マーキング フェーズでない場合、またはすでにマークされている場合は、再度記録する必要がないため、簡単な判断を追加できます。

  1. void pre_write_barrier(oop* フィールド) {
  2. // GC 同時マーキングフェーズで、オブジェクトがマークされていない (訪問されていない)
  3. if($gc_phase == GC_CONCURRENT_MARK && !isMarkd(field)) {
  4. oop old_value = *フィールド; // 古い値を取得する
  5. remark_set.add (古い値) // 元の参照オブジェクトを記録する
  6. }
  7. }

書き込みバリア + 増分更新

オブジェクト D のメンバー変数の参照が変更された場合 (objD.fieldG = G;)、書き込みバリアを使用して、D の新しいメンバー変数参照オブジェクト G を記録できます。

  1. void post_write_barrier(oop* フィールド、oop new_value) {
  2. if($gc_phase == GC_CONCURRENT_MARK && !isMarkd(field)) {
  3. remark_set.add(新しい値); //新しく参照されたオブジェクトを記録する
  4. }
  5. }

【新しい参照が挿入されたら、新しい参照オブジェクトを記録する】このアプローチの考え方は、元のスナップショットを保持する必要はなく、新しく追加された参照については記録し、トラバーサル、つまり増分更新(Incremental Update)を待つというものです。

増分更新により条件 2: [黒いオブジェクトが白いオブジェクトを再参照する] が破られ、ラベルが失われることがなくなります。

ロードバリア

  1. oop oop_field_load(oop* フィールド) {
  2. pre_load_barrier(フィールド); // 読み取りバリア - 事前読み取り操作
  3. *フィールドを返します
  4. }

読み取りバリアは最初のステップvar objF = object.fieldG;を直接ターゲットにします。

  1. void pre_load_barrier(oop* フィールド、oop old_value) {
  2. if($gc_phase == GC_CONCURRENT_MARK && !isMarkd(field)) {
  3. oop old_value = *フィールド;
  4. remark_set.add (古い値) //読み取ったオブジェクトを記録する
  5. }
  6. }
  7. このアプローチは保守的である

このアプローチは保守的ですが、安全でもあります。条件 2 では、[黒いオブジェクトが白いオブジェクトを再参照する] ため、再参照の前提は、白いオブジェクトを取得する必要があることであり、この時点で読み取りバリアが作用します。

3色マーキングとガベージコレクター

増分アップデート: CMS

オリジナルスナップショット(STAB):G1、シェナンドー

参照ドキュメント

https://www.jianshu.com/p/12544c0ad5c1

https://hllvm-group.iteye.com/group/topic/44381

https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html

https://tech.meituan.com/2016/09/23/g1.html

「JVM仮想マシンの徹底理解-第3版」周志明

<<:  エッジコンピューティング、エッジネットワーキング、エッジデータ管理がどのように連携するか

>>:  ガートナー:世界のパブリッククラウド支出は2022年に4,800億ドルを超える

推薦する

ウェブサイトマーケティングはユーザーのニーズに基づいて行い、革新を追求する必要がある

今日、私はギークパークイノベーションカンファレンスでのQihoo 360 CEO の周紅毅氏のスピー...

#Cyber​​Monday# liteserver: 月額 2.5 ユーロ、KVM/1G メモリ/512G ハードディスク/6T トラフィック/オランダ データセンター

liteserver (2007~) オランダデータセンターのVPSの3大カテゴリはブラックフライデ...

weloveservers-ホスティング評価のための 30% 割引コード

weloveserversのVPSに興味がありますか?割引コード: zhujimao 、このサイトの...

ウェブサイトはスタートラインで勝利する:記事タイトルの最適化は非常に重要です

記事のタイトルは魅力的なコートに相当します。美しい服を着ている人は、いつも他の人の注目を集めることが...

Pinduoduo の根底にあるビジネスロジック!

Pinduoduoは、C2B グループ購入に重点を置いたサードパーティのソーシャル e コマース プ...

投資か投機か、WeChatパブリックアカウントのプロモーション戦略をどう実現するか

WeChatパブリックアカウントを0から1、そしてNにまで成長させた運営者として、 WeChatパブ...

検索エンジンマーケティングの2つの「子供」:SEOとPPC

Adsemer の検索マーケティング技術ブログを始めようと計画していた頃、私はまだとあるネットワーク...

さまざまな SEO ポジションの重要なポイントについてのユーモアたっぷりの講演

まず、SEO ポジションを定義する必要があります。そうすることで、さまざまな SEO ポジションの人...

SEO実践者は、業界の専門家になりたいのであれば、悪い習慣を排除する必要があります。

ウェブサイトのランキングを上げるために必要な方法として、SEOはますます多くのウェブマスターに求めら...

Ceph による分散システム障害検出

ノード障害検出は分散システムでは避けられない問題です。クラスターはノードの生存を感知し、適切な調整を...

SEO ページインデックス分析とスパイダークローリング

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますWeb ペ...

企業ウェブサイト構築における模倣・盗作の分析について語る

2011年が過ぎ、2012年の新年がちょうど1週間前に到来しました。仕事の初日、新しいクライアントが...

Vultr クラウド サーバーはどうですか?マイアミデータセンタークラウドサーバーの簡単なレビュー

中国人は米国西海岸に集まるのが好きなので、時には中央下部や南東部などを選択することも検討できます。V...

共同購入は過去のものとなりました。共同購入ウェブサイトの運営の難しさを知っている人はどれくらいいるでしょうか?

共同購入は過去のものなのでしょうか?百連隊作戦を経験し、百連隊勝利の興奮を目にしたにもかかわらず、共...

budgetvm-DDoS 高防御 100g/$114/E3-1230v3/16g メモリ/1T ハードディスク

budgetvm.com の公式スタッフから、100Gbps 保護を謳った、特別価格の DDoS 高...