Open8

GoのGCについてまとめたい

kurokuro

GCのアルゴリズムや、エスケープ解析について詳しい
https://qiita.com/gold-kou/items/4431d3dd41606d41732b

スタック領域へなるべく割り当てられるようにできること
ポインタを避ける
ポインタ型はヒープ領域へ割り当てられます
そもそもポインタは色々重い処理を伴います
time.Timeを避ける
time.Timeはタイムゾーン情報をポインタで持っています
unix timeであれば整数型です
スライスと文字列を避ける
スライスと文字列は可変長のためメモリサイズを確定できないことからヒープ領域へ割り当てられます
配列であれば寿命が確定されればスタック領域へ割り当てられます
「避ける」と書きましたが、現実的には避けることが難しいケースがほとんどだと思いますので、ここら辺はあまり神経質になりすぎないほうがいいかもしれません。

kurokuro

Goのスタックとヒープについて
http://najeira.blogspot.com/2013/10/go.html

関数内だけで使われる値は、スタックに置かれる。
ある関数内で確保した値が、関数外でも必要になるなら、ヒープに置かれる。

というまとめ。

kurokuro

mutator についてわかりやすかった。
https://amasuda.xyz/post/2019-10-22-about-golang-gc/

mutator (変化させるもの) は基本的に実行しているアプリケーションプログラムを指す。 mutator は、object を作成したり、object の参照を更新したりする。しかし、object の領域を解放することはしない(それは GC の仕事)。