Go 言語にはガベージ コレクションがあります。 Go 言語にはガベージ コレクション (GC) 機構が備わっており、GC は別のプロセスで実行され、使用されなくなった変数を検索して解放します。計算上。メモリ空間には、スタック領域 (Stack) とヒープ領域 (Heap) の 2 つの重要な領域が含まれており、スタック領域には通常、関数呼び出しのパラメータ、戻り値、およびローカル変数が格納され、メモリの断片化を生じず、メモリ領域は次のように管理されます。ヒープ領域にはメモリの断片が生成されますが、Go 言語では、ヒープ領域内のオブジェクトはメモリ アロケータによって割り当てられ、ガベージ コレクタによってリサイクルされます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語には独自のガベージ コレクション メカニズム (GC) があります。 GC は別のプロセスによって実行され、使用されなくなった変数を検索して解放します。 GC は実行中にマシン リソースを占有することに注意してください。
コンピューター サイエンスでは、ガベージ コレクション (略してガベージ コレクション (GC)) のことを指します。 ) は自動的なメモリ管理メカニズムです。ガベージ コレクタは、使用されなくなったプログラムによって占有されているオブジェクトとメモリをリサイクルしようとします。
#コンピューティングにおいて、メモリ空間にはスタック領域 (Stack) とヒープ領域 (Heap) という 2 つの重要な領域が含まれています。スタック領域には通常、関数呼び出しが格納されますパラメータ、戻り値、およびローカル変数はメモリの断片化を生成せず、コンパイラによって管理され、開発者が管理する必要はありませんが、ヒープ領域にはメモリの断片化が生成されます。ヒープ領域内のメモリはメモリ アロケータによって割り当てられ、ガベージ コレクタによって収集され、リサイクルされます。 [関連する推奨事項: 通常、ガベージ コレクターの実行プロセスは 2 つの半独立したコンポーネントに分割されます。 ユーザー プログラム (ミューテーター): ユーザー モード コード。GC の場合、ユーザー モード コードはオブジェクト間の参照関係のみを変更します。プログラマは GC の恩恵を受けるため、GC について心配する必要はありません。手動でメモリを適用し、解放操作を行うと、GC はプログラムの実行中に残りのメモリを自動的に解放します。
GC はプログラマにはほとんど見えません。プログラムに特別な最適化が必要な場合にのみ、GC の実行タイミングと実行オーバーヘッドを調整できます。
#1. メモリの管理と割り当てメモリが使用されなくなったら、メモリに移動します管理 標準ライブラリによって自動的に実行されます。つまり、メモリから Go コレクションに割り当てられます。メモリ管理には通常、ユーザー プログラム (ミューテーター)、アロケーター (アロケーター)、コレクター (コレクター) という 3 つの異なるコンポーネントが含まれます。ユーザー プログラムがメモリを適用すると、メモリ アロケーター、アロケーターを通じて新しいメモリが適用されます。ヒープから対応するメモリ領域を初期化します。
#1.1 メモリ アロケータの割り当てメソッドリニア アロケータ (シーケンシャル アロケータ、バンプ アロケータ)
アイドル リンク リストアロケータ (フリーリスト アロケータ)
線形割り当て (バンプ アロケータ) は効率的なメモリ割り当て方法ですが、重要な点があります。制限。ユーザーがリニア アロケータを使用する場合、メモリ内の特定のメモリ位置へのポインタを維持するだけで済みます。ユーザー プログラムがアロケータからメモリを申請する場合、アロケータは残りの空きメモリを確認し、割り当てられたメモリを返すだけで済みます。領域を指定し、メモリ内の場所のポインタを変更します。線形アロケータは実行速度が速く、実装の複雑さが低いですが、メモリが解放された後はメモリを再利用できません。次の図に示すように、割り当てられたメモリがリサイクルされる場合、線形アロケータは赤いメモリを再利用できません。
したがって、線形アロケータは、適切なガベージ コレクション アルゴリズムMark-Compact
GC のコピー
世代リサイクル (世代 GC) )
上記のアルゴリズムは、コピーを通じて生き残ったオブジェクトをデフラグし、空きメモリを定期的にマージできるため、線形アロケータの効率を利用してメモリ アロケータのパフォーマンスを向上させることができます。
Free-List Allocator (Free-List Allocator) は、解放されたメモリを再利用することができ、内部的にリンクされたリストを維持します。構造。ユーザー プログラムがメモリを申請すると、空きリンク リスト アロケータは空きメモリ ブロックを走査して十分な大きさのメモリを見つけ、新しいリソースを申請してリンク リストを変更します
無料のリンク リスト アロケータには 4 つの一般的な戦略があります。 4 番目の戦略は次のとおりです。 Go 言語で使用されるメモリ割り当て戦略に似ています この戦略は、メモリを 4、8、16、および 32 バイトのメモリ ブロックで構成されるリンク リストに分割します。メモリ アロケータに 8 バイトのメモリを要求すると、上図の条件を満たす空きメモリ ブロックを見つけて返します。分離適応の割り当て戦略により、走査する必要があるメモリ ブロックの数が減り、メモリ割り当ての効率が向上します 図はメモリ割り当ての構成を示しています: Go 言語では、ヒープ上のすべてのオブジェクトは runtime.newobject# を呼び出すことによってメモリを割り当てます。 ## 関数, この関数は runtime.mallocgc を呼び出して、指定されたサイズのメモリ領域を割り当てます。これは、ユーザー プログラムがヒープ
1.2 Go でのメモリ割り当て
func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
mp := acquirem()
mp.mallocing = 1
c := gomcache()
var x unsafe.Pointer
noscan := typ == nil || typ.ptrdata == 0
if size 上のメモリ領域を適用するために必要な関数でもあります
runtime .mallocgc オブジェクトのサイズに応じて異なる割り当てロジックを実行し、オブジェクトのサイズに応じてマイクロオブジェクト、小さなオブジェクト、大きなオブジェクトに分割します
— 最初にマイクロ アロケーターを使用し、次にスレッド キャッシュ、中央キャッシュ、ヒープを順番に使用してメモリの割り当てを試みます
— スレッド キャッシュ、中央キャッシュ、ヒープを順番に使用してみます。メモリを割り当てます。
— ヒープ上にメモリを直接割り当てます
小規模な割り当て
32kb 未満の小規模な割り当ての場合, Go は、スパン リスト (32kb メモリ ブロック) mspan
mcache のローカル キャッシュからメモリを取得しようとします。 ##各スレッド M はプロセッサ P に割り当てられ、一度に最大 1 つの
ゴルーチン を処理できます。メモリを割り当てるとき、現在の ゴルーチン
は現在のローカル キャッシュ P を使用して、span
リスト
#Go は、大規模な割り当ての管理にローカル キャッシュを使用しません。 32kb を超えるこれらの割り当てはページ サイズに丸められ、ページはヒープ
##2 に直接割り当てられます。 collectionGo 言語では、ガベージ コレクターによって実装されるアルゴリズムは、3 色のマークとスキャンの同時コレクターです。
ガベージ コレクターは、 Go プログラムなので、メモリ内の潜在的な変更を検出するための書き込みバリア
アルゴリズムを渡す必要があります。書き込みバリアを開始する唯一の条件は、プログラムを短期間停止することです。つまり、「Stop the World」書き込みバリアの目的収集中にコレクターがアクティブな状態を維持できるようにするためです。 ヒープ上のデータの整合性
クリア終了フェーズ
プログラムを一時停止します。この時点ですべてのプロセッサが安全なポイントに入ります。
ステータスを _GCmark
に切り替え、書き込みバリア、ユーザー プログラム アシスタンス (Mutator Assist) を有効にして、ルート オブジェクトをキューに入れます
実行が再開されると、マーキング プロセスと補助ユーザー プログラムが同時にメモリ内のオブジェクトのマークを開始します。書き込みバリアは、上書きされたポインタと新しいポインタの両方を灰色としてマークし、新しく作成されたすべてのオブジェクトは直接黒としてマークされます。 .
すべての Goroutine スタック、グローバル オブジェクト、およびヒープ内にないランタイム データ構造を含む、ルート オブジェクトのスキャンを開始します。Goroutine スタックのスキャン中、現在のプロセッサは一時停止されます
グレーのキュー内のオブジェクトを順番に処理し、オブジェクトを黒でマークし、オブジェクトが指すオブジェクトをグレーでマークします
分散終了アルゴリズムを使用します残りの作業を確認すると、マーキングフェーズが完了すると、マーキング終了フェーズ
マーキング終了フェーズ(STW)
に移行することがわかります。_GCmarktermination に切り替えます。
そして、補助マークのユーザー プログラムを閉じます。クリーニング フェーズ
#状態を _GCoff
に切り替えるクリーンアップ フェーズを開始し、クリーンアップ状態を初期化し、書き込みバリアを閉じます
ユーザー プログラムを復元すると、新しく作成されたすべてのオブジェクトが白でマークされます。
バックグラウンドですべてのメモリ管理ユニットを同時にクリーンアップします。新しいメモリ管理ユニット、クリーンアップがトリガーされます
3 色のマーキングアルゴリズムは、プログラム内のオブジェクトを白、黒、グレーの 3 つのカテゴリに分類します。
#3 色マーク ガベージ コレクタの動作原理は非常に簡単で、次の手順に要約できます。 #灰色のオブジェクトのコレクションから灰色のオブジェクトを選択し、黒にマークします
黒に変換しますオブジェクトが参照するオブジェクトもオブジェクトも参照しないように、オブジェクトが指すすべてのオブジェクトは灰色にマークされます。オブジェクトはリサイクルされます。
オブジェクト グラフに灰色のオブジェクトがなくなるまで、上記の 2 つの手順を繰り返します。
プログラミング ビデオをご覧ください。 !
以上がGo言語にはガベージコレクションがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。