Go

メモリ管理

Stack と heap、escape analysis、garbage collector、メモリプロファイリング、pprof、メモリリーク

24 面接問題·
Senior
1

Go における stack 割り当てと heap 割り当ての主な違いは何ですか?

回答

stack は自動的に管理され、割り当ては非常に高速です(単純な stack pointer の移動)。stack 上の変数は関数が return すると自動的に解放されます。heap はメモリを解放するために garbage collector を必要とし、Go runtime が関与するため割り当てが遅くなります。関数を超えて生き残る変数や、コンパイル時にサイズが不明な変数は heap に配置されます。

2

Go における escape analysis とは何ですか?

回答

escape analysis は、変数が stack 上に留まれるか heap に割り当てる必要があるかを判断するために Go コンパイラが行う静的解析です。コンパイラが変数を生成関数の外で参照していると検出した場合(返されたポインタ、グローバル変数への格納など)、その変数は「escape(脱出)」し、heap に割り当てられます。この解析によりメモリ割り当てが自動的に最適化されます。

3

コンパイル時に escape analysis の結果を確認するにはどうすればよいですか?

回答

-gcflags=-m フラグを使うと escape analysis の判断を確認できます。-m=2 や -m=3 を使うと変数が escape する理由についてより詳細な情報が得られます。例えば 'go build -gcflags=-m=2' は 'moved to heap: x' のようなメッセージを表示し、変数が heap に移動されたことを示します。このツールはクリティカルなコードでのメモリ割り当てを最適化するために不可欠です。

4

ローカル変数が heap に escape するのはどのような場合ですか?

5

Go における garbage collector の主な役割は何ですか?

+21 面接問題

次の面接に向けてGoをマスター

すべての問題、flashcards、技術テスト、コードレビュー演習、面接シミュレーターにアクセス。

無料で始める