1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go言語7つの入門チュートリアル7つのGCガベージコレクション3つのカラーマーカ

2022-01-09 20:29:36

GC

{コード フルネーム {コード

ガベージコレクションのアルゴリズムには、トレースガベージコレクションと参照カウントの2種類が主流である。
/{br 3色マーカー方式は、トレース型ガベージコレクションアルゴリズムの1つです。

トレース・アルゴリズムの核となる考え方は、オブジェクトが到達可能かどうかを判断することです。なぜなら、いったん到達不可能になったオブジェクトは、GCによってすぐに再生されるからです。

オブジェクトが到達可能かどうかを判断する方法
/{br

は、2つのステップに分かれています。

  • 最初のステップでは、グローバル変数と現在の関数スタックにある変数のうち、到達可能であるとマークされたものをすべて見つけます。
  • {を使用します。 第2段階では、すでにマークされているデータから、さらにアクセス可能な変数をマークしていく。このプロセスはクロージャの受け渡しとも呼ばれる。 {これはクロージャの受け渡しとも呼ばれる。

goが3色タグ付け方式を導入する以前、goが使用していたgcアルゴリズムが line = ( Line() .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name='merchant_sales', yaxis_data=y_data, # there is an error here label_opts=opts.LabelOpts(is_show=False), ) ) (マークアンドスイープ)。

このアルゴリズムは、厳密にはトレースベースのアルゴリズムに沿って実装されています。

  • 最初にオブジェクトが使用されているかどうかを記録するためのフラグビットが設定され、最初はすべてのフラグビットが0である。
  • オブジェクトに到達可能であることが判明した場合、次のように設定されます。 y_axis= y_data となり、ステップバイステップの結果、ツリーのような結果になります。
  • {を使用します。 タグ付けのステップが終了すると、タグ付けされていないオブジェクトはクリーンアップされ、次のクリーンアップのためにすべてのタグ付けビットが再び0に設定されます。

このアルゴリズムの最大の問題点は Mark-And-Sweep は、実行中にプログラム全体を完全に停止させる必要があり、非同期に実行することはできません。 1 の操作になります。フラグビット0と1はマーカースイープ法の異なるステージで異なる意味を持つため、新しいオブジェクトがマークされていても誤って削除される可能性があります。リアルタイム性が要求されるシステムでは、ハングタイムが長くなるこのマーカースイープ方式は受け入れがたい。そこで、GC ランタイムの長いハングタイムの問題を解決するアルゴリズムが必要となり、それが 3 色タギング法です。

三色マーカー方式

3色マーカー法は、従来のMark-Sweepを改良したもので、コンカレントGCアルゴリズムである。 GC

原理は以下の通りです。

プロセス空間全体で各オブジェクトが占有するメモリはグラフとみなすことができ、初期状態では各メモリオブジェクトは白色で表示される。

最初 GC スキャンタスクは、CPUが処理する複数の同時実行ゴルーチンとして直ちにスケジューラにキューイングされ、最初のラウンドで到達可能なすべてのメモリオブジェクトを最初にスキャンし、グレーとしてマークし、キューに配置されます

第二ラウンドは、世界を開始再開することができ、最初のキューで参照されるオブジェクトは、すべてのオブジェクトがグレーアウトされ、キューに追加され、オブジェクトは黒とキューから削除することができます。このサイクルが繰り返され、キューが空になると、グラフ全体には到達不可能なオブジェクト、つまり参照されていないオブジェクトである白いメモリ空間が残されることになる。

再び3巡目 on-the-fly を使用して、2 回目のラウンドで追加された新しいオブジェクトが要求するメモリをマーク (グレーアウト) します。

stop the world
stop the world
writebarrier
on-the-fly
A, F
write-barrier
2. すべてのオブジェクトをホワイトコレクションに入れる。

3、そして、ルートノードからすべてのオブジェクトの反復処理を開始します(ここでは再帰的なトラバーサルではないことに注意してください)、白いコレクションから灰色のコレクションにトラバースされたオブジェクト。

ルートセットはA,Fを指しているので、探索開始からのルートノードは

ということで、AとFをグレーセットに入れています。

4、灰色のコレクションをトラバースした後、白のコレクションから灰色のコレクションに灰色のオブジェクトによって参照されるオブジェクトは、黒のコレクションにこの灰色のオブジェクトの後


このAはB、C、Dを指しているので、BCDをグレーに入れ、Aを黒に入れ、Fはどのオブジェクトも参照していないので、直接黒に入れるということが分かります。 5. グレーのオブジェクトが無くなるまで4を繰り返す DはAを指しているのでDも黒に入れられ、BとCはFと同じ理由で黒の集合に入れられるので、指し示す対象はもうないのである。 6, by オブジェクトの変更を検出し、上記の操作を繰り返す このEGHはRootSetとは直接的にも間接的にも関係がないため、クリアされることになる。 画像 7、白い物(ゴミ)を全て回収する 画像 つまり、この場合、ルートセットに直接関連するオブジェクトや、ルートセットに間接的に関連するオブジェクトはクリアされないことがわかる。無関係なものだけがリサイクルされるのです。 参考ドキュメントです。 GCを説明する図
ライトバリアについて ライトバリアについて 以上、Go言語GCガベージコレクション3色マーカー入門チュートリアル7本の詳細でしたが、Go言語GCガベージコレクション3色マーカーについての詳細は、BinaryDevelopの他の関連記事にもご注目ください!(1) Goの学習方法 初心者の方は、こんな感じでGo言語を学ぶことができますよ〜。 Goを始めるための7つの記事 最初の記事 初心者のための囲碁入門 第2部 プログラム構造およびデータ型の紹介 第3部 関数-メソッドインターフェース入門 第4部 チャンネルとGoroutineの同時プログラミング 第五部 ファイルおよびパッケージの操作と取り扱い 第6部 ネットワーク・プログラミング