ホームページ  >  記事  >  バックエンド開発  >  Go 言語には GC がありますか?

Go 言語には GC がありますか?

青灯夜游
青灯夜游オリジナル
2022-11-24 20:21:052660ブラウズ

go 言語には gc があります。 GC は、自動メモリ管理メカニズムであるガベージ コレクションを指します。Go 言語は GC をサポートしており、Go 言語におけるオブジェクト メモリ空間のリサイクルは GC メカニズムを通じて完了します。 Go 言語の場合、Go 言語の GC は 3 つの色を使用します: 世代なし (オブジェクトが世代に分割されない)、ソートなし (リサイクル プロセス中にオブジェクトが移動およびソートされない)、および同時 (ユーザー コードと同時に実行される) . マークおよびスイープのアルゴリズム。

Go 言語には GC がありますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

GC 機構は Java 言語が普及してから一般的になり、たとえば後発のスクリプト言語 Python も GC をサポートしており、GO も GC をサポートしています。

Go 言語と C/C 言語の注目すべき特徴は、Go におけるオブジェクト メモリ空間のリサイクルが GC メカニズムを通じて完了することであり、C のようなプログラマによる手動の適用と解放を必要としないため、 Go ではメモリ リークが発生する可能性は比較的低いです。今日はGoのGCメカニズムについてお話します。

GC とは何ですか?またその用途は何ですか?

GC (正式名ガベージ コレクション) は、自動メモリ管理のメカニズムです。

プログラムによってオペレーティング システムから要求されたメモリが不要になると、ガベージ コレクションはメモリを積極的にリサイクルし、他のコードでメモリに適用するために再利用するか、オペレーティング システムに返します。これはメモリ用です。 -レベルのリソース。自動リサイクル プロセスはガベージ コレクションです。ガベージ コレクションを担当するプログラム コンポーネントはガベージ コレクターです。

ガベージ コレクションは、実際には「単純さは複雑である」の完璧な例です。一方で、プログラマは GC の恩恵を受け、メモリについて心配したり、手動でメモリを適用したり解放したりする必要がなくなり、プログラムの実行中に残りのメモリが自動的に解放されます。一方、GC はプログラマにはほとんど見えず、GC の実行タイミングと実行オーバーヘッドを制御するための制御可能な API を提供することで、プログラムに特別な最適化が必要な場合にのみ表示されます。

通常、ガベージ コレクターの実行プロセスは 2 つの半独立したコンポーネントに分割されます。

  • ミューテーター: この名前は基本的に、ユーザー モードを表すコードを指します。なぜなら、ガベージ コレクターの場合、ユーザー モード コードはオブジェクト間の参照関係を変更するだけ、つまりオブジェクト グラフ (オブジェクト間の参照関係の有向グラフ) を操作するだけだからです。

  • コレクター: ガベージ コレクションの実行を担当するコード。

#GC のルート オブジェクト

ルート オブジェクトは、ガベージ コレクションの用語ではルート コレクションとも呼ばれます。プロセスをマークするときにガベージ コレクターが最初にチェックするオブジェクトは次のとおりです。

  • グローバル変数: プログラムのライフ サイクル全体にわたって存在し、コンパイル時に決定できる変数。

  • 実行スタック: 各ゴルーチンには独自の実行スタックが含まれており、スタック上の変数と割り当てられたヒープ メモリ ブロックへのポインタが含まれています。

  • レジスタ: レジスタの値はポインタを表す場合があり、計算に含まれるこれらのポインタは、評価器によって割り当てられたヒープ メモリ ブロックを指す場合があります。

GC の実装方法

すべての GC アルゴリズムの存在は、追跡と参照として要約できます。これら 2 つの形式の混合物。

  • GC の追跡

    ルート オブジェクトから開始し、オブジェクト間の参照情報に基づいて、ヒープ全体がスキャンされるまで段階的に進みます。保持する必要があるオブジェクトを決定し、それによってすべてのリサイクル可能なオブジェクトをリサイクルします。 Go、Java、および V8 の JavaScript 実装はすべて GC を追跡します。

  • 参照カウント GC

    各オブジェクト自体には参照カウンタが含まれており、カウンタがゼロになると自動的にリサイクルされます。この方法には欠点が多いため、高性能を追求する場合には通常は使用されません。 Python、Objective-C などはすべて参照カウント GC です。

現在、より一般的な GC 実装方法には、次のものが含まれます。

  • トラッキング タイプ。これは、次のようなさまざまなタイプに分類されます。

      マーキングとスイープ: ルート オブジェクトから開始して、生きていると判断されたオブジェクトにマークが付けられ、リサイクルできるオブジェクトがクリーンアップされます。
    • マーキングとデフラグメンテーション: メモリの断片化の問題を解決するために提案されており、マーキング プロセス中、オブジェクトは可能な限り連続したメモリの断片に編成されます。
    • インクリメンタル: マーキングとクリーニングのプロセスをバッチで実行し、毎回小さな部分を実行することでガベージ コレクションを段階的に進め、ほぼ停止せずにほぼリアルタイムでの達成を実現します。
    • インクリメンタルソート: インクリメンタルメソッドに基づいて、オブジェクトソートプロセスが追加されます。
    • 世代: 生存時間の長さに応じてオブジェクトを分類します。生存時間が特定の値未満であるものは若い世代、生存時間が特定の値より大きいものは若い世代です。リサイクルに決して参加しない古い世代、対象となるのは永続世代です。そして、オブジェクトは世代の仮定に基づいてリサイクルされます (オブジェクトが長く存続しない場合はリサイクルされる傾向があり、オブジェクトが長期間存続する場合はより長く存続する傾向があります)。

  • #参照カウント: オブジェクト自身の参照カウントに従ってリサイクルし、参照カウントがゼロになるとすぐにリサイクルします。

Go における GC の実装

Go の場合、Go の GC はジェネレーションレス (オブジェクトは世代に分割されません) を使用します。 )、ソートなし (リサイクル プロセス中にオブジェクトが移動およびソートされない)、および同時 (ユーザー コードと同時に実行される) 3 色マーク クリーニング アルゴリズム。 [関連する推奨事項: Go ビデオ チュートリアル ]

理由は次のとおりです:

  • オブジェクトのデフラグの利点は、メモリの断片化の問題を解決できることです。メモリアロケータの使用順序を「許可」します。ただし、Go ランタイム割り当てアルゴリズムは tcmalloc に基づいており、基本的に断片化の問題はありません。また、シーケンシャル メモリ アロケータはマルチスレッド シナリオには適していません。 Go は tcmalloc に基づいた最新のメモリ割り当てアルゴリズムを使用しており、オブジェクトの並べ替えによって大幅なパフォーマンスの向上はもたらされません。

  • 世代別 GC は世代の仮定に依存します。つまり、GC は、頻繁に作成されるオブジェクトではなく、新しく作成されたオブジェクト (生存時間が短く、リサイクルされる可能性が高い) に主な回復ターゲットを置きます。すべてのオブジェクトをチェックします。ただし、Go のコンパイラは、エスケープ解析を通じてほとんどの新しいオブジェクトをスタックに保存し (スタックは直接リサイクルされます)、長期間存在する必要があるオブジェクトのみがガベージ コレクションを必要とするヒープに割り当てられます。つまり、世代別 GC によってリサイクルされる短命オブジェクトは、Go のスタックに直接割り当てられ、ゴルーチンが終了すると、スタックは GC を介さずに直接リサイクルされます。直接的に利益を得るために。さらに、Go のガベージ コレクターはユーザー コードと同時に実行されるため、STW 時間はオブジェクトの生成やオブジェクトのサイズとは関係ありません。 Go チームは、一時停止時間を短縮するという 1 つの目標よりも、(適切な CPU を使用してガベージ コレクションを実行する) GC をユーザー コードと同時に実行できるようにする方法に重点を置いています。

プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !

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

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