ホームページ >バックエンド開発 >Golang >golang には GC がありますか?

golang には GC がありますか?

(*-*)浩
(*-*)浩オリジナル
2019-12-31 11:24:473020ブラウズ

golang には GC がありますか?

GO のガベージ コレクター

Go 言語のガベージ コレクションでは、通常、古典的なマーク アンド スイープ アルゴリズムが使用されます。 (推奨学習: Go )

1.3 バージョン以前は、Golang のガベージ リカバリ アルゴリズムは非常にシンプルでしたが、そのパフォーマンスは広く批判されました。特定の条件下での Go ランタイム (メモリ (メモリ) (メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(メモリ(memory (memory (memory しきい値を超えると、または定期的(2 分など)に、すべてのタスクの実行が一時停止され、マーク&スイープ操作が実行され、操作の完了後にすべてのタスクの実行が開始されます。)

大量のメモリが使用されるシナリオでは、go プログラムでガベージ コレクションを実行すると、明らかなスタック現象 (Stop The World) が発生します。高い応答速度が必要なバックグラウンド サービス プロセスでは、この種の遅延はまったく許容できません。この期間中、本番環境で Go 言語を練習していた国内外の多くのチームが、多かれ少なかれ gc の落とし穴を踏んでしまいました。

当時この問題を解決する一般的な方法は、自動的に割り当てられるメモリの量をできるだけ早く制御して gc の負荷を軽減し、同時に手動のメモリ管理を使用して次のようなシナリオに対処することでした。大量のメモリと高頻度の割り当てが必要です。

バージョン 1.3 以降、go チームは GC のパフォーマンスの継続的な改善と最適化を開始しており、go の新しいバージョンがリリースされるたびに、GC の改善に全員の注目が集まるようになりました。

バージョン 1.3 では、go ランタイムはマーク操作とスイープ操作を分離します。以前と同様に、すべてのタスクの実行が一時停止され、マークが開始されます。マークが完了すると、一時停止されたタスクがすぐに再開され、スイープが実行されます。タスクは次のとおりです。通常のコルーチン タスクと同様に、他のタスクと並行して実行されます。

マルチコア プロセッサ上で実行されている場合、go はビジネス コードの実行に影響を与えることなく、別のコア上で gc タスクを実行しようとします。 Go チーム自身の声明では、一時停止時間が 50% ~ 70% 短縮されたとのことです。

バージョン 1.4 (最新の安定バージョン) では、gc のパフォーマンスに多くの変更は加えられていません。バージョン 1.4 では、多くのランタイム コードがネイティブ C 言語実装を Go 言語実装に置き換えました。gc に加えられた大きな変更は、正確な gc を実現できることです。

C言語実装ではgc時にメモリ上のオブジェクト情報を取得できないため、通常の変数とポインタを正確に区別できず、通常の変数はポインタとしてしか扱えません。この通常の変数が指すスペースがある場合、このオブジェクトはリサイクルされません。

Go 言語の実装はオブジェクトの型情報を完全に認識しており、マークするときにポインタが指すオブジェクトのみをトラバースするため、C 実装でのヒープ メモリの無駄が回避されます (約 10 ~ 30% の問題を解決します)。 )。

バージョン 1.5 では、go チームは gc に大幅な改良を加えました (書き込みバリアの導入など、1.4 で予兆が示されています) 公式の主な目標は遅延を減らすことです。 go 1.5 で実装されているガベージ コレクターは、「非世代、非移動、同時実行、3 色のマーク アンド スイープ ガベージ コレクター」です。

世代別アルゴリズムについては上で説明しましたが、より優れたガベージ コレクション管理戦略です。ただし、その実装はバージョン 1.5 では考慮されていません。その理由は、ステップが大きすぎてはいけないためだと思います。改善が進んでおり、go 関係者もバージョン 1.6 の GC 最適化で検討される予定であると述べています。

同時に、上で紹介した 3 色マーキング方法を導入します。この方法のマーク操作は、毎回メモリ空間全体をスキャンすることなく徐々に実行できるため、ワールドを停止する時間を短縮できます。 。

go のガベージ コレクションのパフォーマンスはバージョン 1.5 までずっと向上していることがわかりますが、比較的成熟したガベージ コレクション システム (java jvm や javascript v8 など) の場合、go はpath まだまだ先は長いです(でも未来は明るいと信じていますよ~)。

以上がgolang には GC がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。