Go 言語は手動でメモリを管理する必要がありますか?

青灯夜游
リリース: 2022-12-16 15:05:59
オリジナル
5165 人が閲覧しました

go 言語には手動のメモリ管理は必要なく、自動メモリ管理メカニズムであるメモリ管理機能 (GC メカニズム) が組み込まれています。オペレーティング システムからプログラムによって要求されたメモリが不要になると、ガベージ コレクションはメモリをアクティブにリサイクルし、他のコードでメモリに適用するために再利用するか、オペレーティング システムに返します。このメモリ レベルのリソースの自動リサイクル プロセスは、次のとおりです。これはガベージ コレクションであり、ガベージ コレクションを担当するプログラム コンポーネントはガベージ コレクターです。

Go 言語は手動でメモリを管理する必要がありますか?

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

go 言語は手動のメモリ管理を必要としません; go 言語にはメモリ管理機能 (GC メカニズム) が組み込まれており、開発者はアプリケーションとリリースを気にする必要がありません。これにより、ユーザーは非常に便利になります。

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

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

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

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

計算において、メモリ空間にはスタック領域 (Stack) とヒープ領域 (Heap) の 2 つの重要な領域が含まれており、スタック領域には通常、関数呼び出しのパラメータ、戻り値、ローカル変数が格納されます。メモリの断片化はコンパイラによって管理され、開発者が管理する必要はありません; ヒープ領域はメモリの断片化を生成します Go 言語では、ヒープ領域内のオブジェクトはメモリ アロケータによって割り当てられ、ガベージによってリサイクルされますコレクター

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

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

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

GC のルート オブジェクト

ルート オブジェクトは、ガベージ コレクションの用語でルート コレクションとも呼ばれます。

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

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

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

#ガベージ コレクション

Go 言語では、ガベージ コレクターによって実装されるアルゴリズム同時 3 色マークおよびスキャン コレクターです。

ガベージ コレクターは Go プログラムと同時に実行されるため、メモリ内の潜在的な変更を検出するには

書き込みバリア アルゴリズムが必要です。書き込みバリアを開始する唯一の条件は、プログラムを短期間停止することです。つまり、「Stop the World」

Go 言語は手動でメモリを管理する必要がありますか?

書き込みバリアの目的収集中にコレクターがアクティブな状態を維持できるようにするためです。 ヒープ上のデータの整合性

#1.1 実装原則

#Go 言語のガベージ コレクション缶クリア終了、マーク、マーク終了に分かれており、4 つの異なるフェーズをクリアすると、そのうちの 2 つはストップ ザ ワールド (STW)

Go 言語は手動でメモリを管理する必要がありますか?

クリア終了フェーズ

    プログラムを一時停止します。この時点ですべてのプロセッサが安全なポイントに入ります。
  • 現在のガベージ コレクション サイクルが強制的にトリガーされる場合は、メモリ管理ユニットにも対処する必要があります。クリーンアップされていない

マーキング フェーズ (STW)

  • ステータスを

    _GCmark に切り替え、有効にします書き込みバリア、ユーザー プログラム アシスタンス (ミューテーター アシスト)、ルート オブジェクトのエンキュー

  • 実行プログラムを再開すると、マーキング プロセスと支援ユーザー プログラムが同時にメモリ内のオブジェクトのマークを開始します。書き込みバリアは、上書きされたポインタと新しいポインタの両方を灰色でマークします。すべて新しい 作成されたオブジェクトは直接黒でマークされます

  • すべての Goroutine スタック、グローバル オブジェクト、およびヒープ内にないランタイム データ構造を含むルート オブジェクトのスキャンを開始します。現在のプロセッサ

  • は灰色のキュー内のオブジェクトを順番に処理し、オブジェクトを黒でマークし、オブジェクトが指すオブジェクトを灰色でマークします

  • 使用分散終了アルゴリズムは残りの作業をチェックし、マーキング フェーズの完了後にマーキング終了フェーズに入ることがわかります

マーキング終了フェーズ (STW)

    #プログラムを一時停止し、状態を
  • _GCmarktermination に切り替え、補助マーク付きユーザー プログラムを閉じます
  • プロセッサ上のスレッド キャッシュをクリーンアップします
##クリーニング フェーズ

    状態を
  • _GCoff

    に切り替えます。クリーンアップ フェーズを開始し、クリーンアップ状態を初期化し、書き込みバリアを閉じます

    #リカバリ ユーザー プログラム、新しく作成されたすべてのオブジェクトは白でマークされます
  • ##バックグラウンドですべてのメモリ管理ユニットを同時にクリーンアップします。 Goroutine が新しいメモリ管理ユニットを適用するときにトリガーされます

1.2 3 色のマーキング方法

3 色マーキング アルゴリズムは、プログラム内のオブジェクトを白、黒、グレーの 3 つのカテゴリに分類します。

白いオブジェクト - 潜在的なガベージ。そのメモリはガベージ コレクターによって再利用される可能性があります。

黒いオブジェクト- アクティブ オブジェクト (外部ポインタを持たないオブジェクトやルート オブジェクトから参照されるオブジェクトを含む) 到達可能なオブジェクト
  • 灰色のオブジェクト - アクティブ オブジェクト。白いオブジェクトへの外部ポインタがあるため、ガベージ コレクターがスキャンします。これらのオブジェクトの子オブジェクト
  • #3 色マークのガベージ コレクション ツールの動作原理は非常に単純で、次の手順に要約できます。
# #グレーのオブジェクトのコレクションからグレーのオブジェクトを選択し、黒にマークします

  • 黒のオブジェクトが指すすべてのオブジェクトをグレーとしてマークし、そのオブジェクトも、そのオブジェクトが参照するオブジェクトも存在しないようにします。オブジェクトはリサイクルされます

  • # オブジェクト グラフに灰色のオブジェクトがなくなるまで、上記の 2 つの手順を繰り返します
  • ##プログラミング関連の知識については、

    プログラミング ビデオ
  • をご覧ください。 !

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート