ホームページ >バックエンド開発 >Golang >Go言語にはガベージコレクションがありますか?

Go言語にはガベージコレクションがありますか?

青灯夜游
青灯夜游オリジナル
2022-12-09 19:42:387057ブラウズ

Go 言語にはガベージ コレクションがあります。 Go 言語にはガベージ コレクション (GC) 機構が備わっており、GC は別のプロセスで実行され、使用されなくなった変数を検索して解放します。計算上。メモリ空間には、スタック領域 (Stack) とヒープ領域 (Heap) の 2 つの重要な領域が含まれており、スタック領域には通常、関数呼び出しのパラメータ、戻り値、およびローカル変数が格納され、メモリの断片化を生じず、メモリ領域は次のように管理されます。ヒープ領域にはメモリの断片が生成されますが、Go 言語では、ヒープ領域内のオブジェクトはメモリ アロケータによって割り当てられ、ガベージ コレクタによってリサイクルされます。

Go言語にはガベージコレクションがありますか?

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

Go 言語には独自のガベージ コレクション メカニズム (GC) があります。 GC は別のプロセスによって実行され、使用されなくなった変数を検索して解放します。 GC は実行中にマシン リソースを占有することに注意してください。

Go 言語のガベージ コレクション メカニズム GC の詳細な説明

コンピューター サイエンスでは、ガベージ コレクション (略してガベージ コレクション (GC)) のことを指します。 ) は自動的なメモリ管理メカニズムです。ガベージ コレクタは、使用されなくなったプログラムによって占有されているオブジェクトとメモリをリサイクルしようとします。

プログラマは GC の恩恵を受けるため、GC について心配する必要はありません。手動でメモリを適用し、解放操作を行うと、GC はプログラムの実行中に残りのメモリを自動的に解放します。
GC はプログラマにはほとんど見えません。プログラムに特別な最適化が必要な場合にのみ、GC の実行タイミングと実行オーバーヘッドを調整できます。

#コンピューティングにおいて、メモリ空間にはスタック領域 (Stack) とヒープ領域 (Heap) という 2 つの重要な領域が含まれています。スタック領域には通常、関数呼び出しが格納されますパラメータ、戻り値、およびローカル変数はメモリの断片化を生成せず、コンパイラによって管理され、開発者が管理する必要はありませんが、ヒープ領域にはメモリの断片化が生成されます。ヒープ領域内のメモリはメモリ アロケータによって割り当てられ、ガベージ コレクタによって収集され、リサイクルされます。 [関連する推奨事項:

Go ビデオ チュートリアル プログラミング教育 ]

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

ユーザー プログラム (ミューテーター): ユーザー モード コード。GC の場合、ユーザー モード コードはオブジェクト間の参照関係のみを変更します。
  • コレクター (コレクター): ガベージ コレクションの実行を担当します。 コード

#1. メモリの管理と割り当てメモリが使用されなくなったら、メモリに移動します管理 標準ライブラリによって自動的に実行されます。つまり、メモリから Go コレクションに割り当てられます。メモリ管理には通常、ユーザー プログラム (ミューテーター)、アロケーター (アロケーター)、コレクター (コレクター) という 3 つの異なるコンポーネントが含まれます。ユーザー プログラムがメモリを適用すると、メモリ アロケーター、アロケーターを通じて新しいメモリが適用されます。ヒープから対応するメモリ領域を初期化します。

Go言語にはガベージコレクションがありますか?

#1.1 メモリ アロケータの割り当てメソッド

プログラミング言語では、メモリ アロケータには通常 2 つの割り当て方法があります。

リニア アロケータ (シーケンシャル アロケータ、バンプ アロケータ)

  • アイドル リンク リストアロケータ (フリーリスト アロケータ)

  • 線形アロケータ

線形割り当て (バンプ アロケータ) は効率的なメモリ割り当て方法ですが、重要な点があります。制限。ユーザーがリニア アロケータを使用する場合、メモリ内の特定のメモリ位置へのポインタを維持するだけで済みます。ユーザー プログラムがアロケータからメモリを申請する場合、アロケータは残りの空きメモリを確認し、割り当てられたメモリを返すだけで済みます。領域を指定し、メモリ内の場所のポインタを変更します。線形アロケータは実行速度が速く、実装の複雑さが低いですが、メモリが解放された後はメモリを再利用できません。次の図に示すように、割り当てられたメモリがリサイクルされる場合、線形アロケータは赤いメモリを再利用できません。

したがって、線形アロケータは、適切なガベージ コレクション アルゴリズム

Go言語にはガベージコレクションがありますか?

Mark-Compact

  • GC のコピー

  • 世代リサイクル (世代 GC) )

  • 上記のアルゴリズムは、コピーを通じて生き残ったオブジェクトをデフラグし、空きメモリを定期的にマージできるため、線形アロケータの効率を利用してメモリ アロケータのパフォーマンスを向上させることができます。

Free-List Allocator

Free-List Allocator (Free-List Allocator) は、解放されたメモリを再利用することができ、内部的にリンクされたリストを維持します。構造。ユーザー プログラムがメモリを申請すると、空きリンク リスト アロケータは空きメモリ ブロックを走査して十分な大きさのメモリを見つけ、新しいリソースを申請してリンク リストを変更します

Go言語にはガベージコレクションがありますか?

無料のリンク リスト アロケータには 4 つの一般的な戦略があります。

  • First-Fit - リンク リストの先頭からトラバースし、最初のサイズのメモリを選択します。要求されたメモリより大きいブロック
  • ループの最初の適応 (Next-Fit) - 最後のトラバーサルの終わりからトラバースし、要求されたメモリよりも大きいサイズの最初のメモリ ブロックを選択します
  • 最適な適応 (ベストフィット) — リンク リストの先頭からリンク リスト全体をたどって、最も適切なメモリ ブロックを選択します。
  • 分離された適応 (分離フィット) — メモリを複数のリンク リストに分割します。各リンク リストのメモリ ブロックのサイズ 同様に、メモリを申請するときは、まず条件を満たすリンク リストを見つけてから、そのリンク リストから適切なメモリ ブロックを選択します。

4 番目の戦略は次のとおりです。 Go 言語で使用されるメモリ割り当て戦略に似ています

Go言語にはガベージコレクションがありますか?

この戦略は、メモリを 4、8、16、および 32 バイトのメモリ ブロックで構成されるリンク リストに分割します。メモリ アロケータに 8 バイトのメモリを要求すると、上図の条件を満たす空きメモリ ブロックを見つけて返します。分離適応の割り当て戦略により、走査する必要があるメモリ ブロックの数が減り、メモリ割り当ての効率が向上します

1.2 Go でのメモリ割り当て

図はメモリ割り当ての構成を示しています:

Go言語にはガベージコレクションがありますか?

Go 言語では、ヒープ上のすべてのオブジェクトは runtime.newobject# を呼び出すことによってメモリを割り当てます。 ## 関数, この関数は runtime.mallocgc を呼び出して、指定されたサイズのメモリ領域を割り当てます。これは、ユーザー プログラムがヒープ

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 オブジェクトのサイズに応じて異なる割り当てロジックを実行し、オブジェクトのサイズに応じてマイクロオブジェクト、小さなオブジェクト、大きなオブジェクトに分割します

    マイクロ オブジェクト
  • (0, 16B) — 最初にマイクロ アロケーターを使用し、次にスレッド キャッシュ、中央キャッシュ、ヒープを順番に使用してメモリの割り当てを試みます
  • Small object
  • [16B, 32KB] — スレッド キャッシュ、中央キャッシュ、ヒープを順番に使用してみます。メモリを割り当てます。
  • Large object
  • (32KB, ∞) — ヒープ上にメモリを直接割り当てます

Go言語にはガベージコレクションがありますか?

小規模な割り当て

32kb 未満の小規模な割り当ての場合, Go は、スパン リスト (32kb メモリ ブロック)

mspan

# を処理する

mcacheGo言語にはガベージコレクションがありますか? のローカル キャッシュからメモリを取得しようとします。 ##各スレッド M はプロセッサ P に割り当てられ、一度に最大 1 つの

ゴルーチン

を処理できます。メモリを割り当てるとき、現在の ゴルーチンは現在のローカル キャッシュ P を使用して、span リスト

large Allocation## で最初に使用可能な空きオブジェクトを見つけます。

#Go は、大規模な割り当ての管理にローカル キャッシュを使用しません。 32kb を超えるこれらの割り当てはページ サイズに丸められ、ページはヒープ

Go言語にはガベージコレクションがありますか?

##2 に直接割り当てられます。 collectionGo 言語では、ガベージ コレクターによって実装されるアルゴリズムは、3 色のマークとスキャンの同時コレクターです。

ガベージ コレクターは、 Go プログラムなので、メモリ内の潜在的な変更を検出するための

書き込みバリア

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

Go言語にはガベージコレクションがありますか?書き込みバリアの目的収集中にコレクターがアクティブな状態を維持できるようにするためです。 ヒープ上のデータの整合性

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

Go言語にはガベージコレクションがありますか?クリア終了フェーズ

プログラムを一時停止します。この時点ですべてのプロセッサが安全なポイントに入ります。

    現在のガベージ コレクション サイクルが強制的にトリガーされる場合は、メモリ管理ユニットにも対処する必要があります。クリーンアップされていない
  • マーキング フェーズ (STW)

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

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

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

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

  • 分散終了アルゴリズムを使用します残りの作業を確認すると、マーキングフェーズが完了すると、マーキング終了フェーズ

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

に移行することがわかります。
  • プログラムを一時停止し、状態を _GCmarktermination に切り替えます。 そして、補助マークのユーザー プログラムを閉じます。
  • プロセッサ上のスレッド キャッシュをクリアします。

クリーニング フェーズ

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

  • ユーザー プログラムを復元すると、新しく作成されたすべてのオブジェクトが白でマークされます。

  • バックグラウンドですべてのメモリ管理ユニットを同時にクリーンアップします。新しいメモリ管理ユニット、クリーンアップがトリガーされます

2.2 3 色のマーキング方法

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

  • 白いオブジェクト — ガベージの可能性があり、そのメモリはガベージ コレクターによって再利用される可能性があります
  • 黒いオブジェクト—外部ポインタへの参照を持たないオブジェクトや、ルート オブジェクトから到達可能なオブジェクトを含むアクティブ オブジェクト
  • 灰色のオブジェクト - アクティブ オブジェクト。白いオブジェクトを指す外部ポインタがあるため、ガベージ コレクターはサブオブジェクトをスキャンします。これらのオブジェクトのオブジェクト

#3 色マーク ガベージ コレクタの動作原理は非常に簡単で、次の手順に要約できます。 #灰色のオブジェクトのコレクションから灰色のオブジェクトを選択し、黒にマークします

  • 黒に変換しますオブジェクトが参照するオブジェクトもオブジェクトも参照しないように、オブジェクトが指すすべてのオブジェクトは灰色にマークされます。オブジェクトはリサイクルされます。

  • オブジェクト グラフに灰色のオブジェクトがなくなるまで、上記の 2 つの手順を繰り返します。

プログラミング関連の知識について詳しくは、

プログラミング ビデオ1Go言語にはガベージコレクションがありますか?をご覧ください。 !

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

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