go 言語には手動のメモリ管理は必要なく、自動メモリ管理メカニズムであるメモリ管理機能 (GC メカニズム) が組み込まれています。オペレーティング システムからプログラムによって要求されたメモリが不要になると、ガベージ コレクションはメモリをアクティブにリサイクルし、他のコードでメモリに適用するために再利用するか、オペレーティング システムに返します。このメモリ レベルのリソースの自動リサイクル プロセスは、次のとおりです。これはガベージ コレクションであり、ガベージ コレクションを担当するプログラム コンポーネントはガベージ コレクターです。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
go 言語は手動のメモリ管理を必要としません; go 言語にはメモリ管理機能 (GC メカニズム) が組み込まれており、開発者はアプリケーションとリリースを気にする必要がありません。これにより、ユーザーは非常に便利になります。
GC とは何ですか?またその用途は何ですか?
GC (正式名ガベージ コレクション) は、自動メモリ管理のメカニズムです。
プログラムによってオペレーティング システムから要求されたメモリが不要になると、ガベージ コレクションはメモリを積極的にリサイクルし、他のコードでメモリに適用するために再利用するか、オペレーティング システムに返します。これはメモリ用です。 -レベルのリソース。自動リサイクル プロセスはガベージ コレクションです。ガベージ コレクションを担当するプログラム コンポーネントはガベージ コレクターです。
ガベージ コレクションは、実際には「単純さは複雑である」の完璧な例です。一方で、プログラマは GC の恩恵を受け、メモリについて心配したり、手動でメモリを適用したり解放したりする必要がなくなり、プログラムの実行中に残りのメモリが自動的に解放されます。一方、GC はプログラマにはほとんど見えず、GC の実行タイミングと実行オーバーヘッドを制御するための制御可能な API を提供することで、プログラムに特別な最適化が必要な場合にのみ表示されます。
計算において、メモリ空間にはスタック領域 (Stack) とヒープ領域 (Heap) の 2 つの重要な領域が含まれており、スタック領域には通常、関数呼び出しのパラメータ、戻り値、ローカル変数が格納されます。メモリの断片化はコンパイラによって管理され、開発者が管理する必要はありません; ヒープ領域はメモリの断片化を生成します Go 言語では、ヒープ領域内のオブジェクトはメモリ アロケータによって割り当てられ、ガベージによってリサイクルされますコレクター
通常、ガベージ コレクション ミューテーターの実行プロセスは、2 つの半独立したコンポーネントに分割されます。
ミューテーター: この名前は、基本的にユーザー モード コードを指します。なぜなら、ガベージ コレクターの場合、ユーザー モード コードはオブジェクト間の参照関係を変更するだけ、つまりオブジェクト グラフ (オブジェクト間の参照関係の有向グラフ) を操作するだけだからです。
コレクター: ガベージ コレクションの実行を担当するコード。
GC のルート オブジェクト
ルート オブジェクトは、ガベージ コレクションの用語でルート コレクションとも呼ばれます。
グローバル変数: プログラムのライフサイクル全体にわたって存在し、コンパイル時に決定できる変数。
実行スタック: 各ゴルーチンには独自の実行スタックが含まれており、スタック上の変数と割り当てられたヒープ メモリ ブロックへのポインタが含まれています。
レジスタ: レジスタの値はポインタを表す場合があり、計算に含まれるこれらのポインタは、一部の評価者によって割り当てられたヒープ メモリ ブロックを指す場合があります。
書き込みバリア アルゴリズムが必要です。書き込みバリアを開始する唯一の条件は、プログラムを短期間停止することです。つまり、「Stop the World」
書き込みバリアの目的収集中にコレクターがアクティブな状態を維持できるようにするためです。 ヒープ上のデータの整合性
クリア終了フェーズ
マーキング フェーズ (STW)
_GCmark に切り替え、有効にします書き込みバリア、ユーザー プログラム アシスタンス (ミューテーター アシスト)、ルート オブジェクトのエンキュー
実行プログラムを再開すると、マーキング プロセスと支援ユーザー プログラムが同時にメモリ内のオブジェクトのマークを開始します。書き込みバリアは、上書きされたポインタと新しいポインタの両方を灰色でマークします。すべて新しい 作成されたオブジェクトは直接黒でマークされます
すべての Goroutine スタック、グローバル オブジェクト、およびヒープ内にないランタイム データ構造を含むルート オブジェクトのスキャンを開始します。現在のプロセッサ
は灰色のキュー内のオブジェクトを順番に処理し、オブジェクトを黒でマークし、オブジェクトが指すオブジェクトを灰色でマークします
使用分散終了アルゴリズムは残りの作業をチェックし、マーキング フェーズの完了後にマーキング終了フェーズに入ることがわかります
マーキング終了フェーズ (STW)
に切り替え、補助マーク付きユーザー プログラムを閉じます
に切り替えます。クリーンアップ フェーズを開始し、クリーンアップ状態を初期化し、書き込みバリアを閉じます
##バックグラウンドですべてのメモリ管理ユニットを同時にクリーンアップします。 Goroutine が新しいメモリ管理ユニットを適用するときにトリガーされます
##プログラミング関連の知識については、
プログラミング ビデオ以上がGo 言語は手動でメモリを管理する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。