やる気がストロングZERO

やる気のストロングスタイル

GCについて調べてて理解したことの雑メモ

GCについて調べてて理解したことを雑にメモります。(間違いあったらご指摘ください)

GCでやること

不要オブジェクトの開放

これはそのままの意味。もう使われていないオブジェクトは破棄してメモリを開ける。

使用オブジェクトの再配置

メモリの確保、開放を繰り返すとメモリがフラグメント化する。 オブジェクトは連続したメモリ領域に配置される必要があるため、フラグメント化すると全体としては空き領域があるのにオブジェクトを確保できなくなったりする。 そのため、確保されているオブジェクトを再配置してフラグメント化を解消する。

アルゴリズム

細かくは色々あるけどざっくり以下

定期的にまとめてGC

定期的にメモリを走査して不要オブジェクトを開放する。 「定期的」とは一定時間だったり、メモリ不足のタイミングだったりする。 メモリ全体を処理するので時間がかかる。スレッド停止時間も長い。

JavaとかRubyとかはこれらしい。

参照が切れたら即GC

オブジェクトごとに参照カウンタをもっていて、これが0になったら即開放される。 都度都度実行されるので処理時間は短いが、参照カウンタの運用などにオーバーヘッドがあったりメモリが必要だったりする。 また、条件によっては大量のGCが必要になり停止時間が長くなったりする。

Pythonがこれらしい。

これらはどれか一つというわけではなく、複合的にアルゴリズムが組み合わされて使用される。

だれがGCを行っているのか?

JVMインタプリタ言語の場合

Javaの場合はJVM

Rubyの場合はRubyインタプリタPythonも同じくPythonインタプリタ

実行ファイルを実行する言語の場合はだれがGCを実行するのか?

CやC++にはGCを言語レベルでは提供していない。(ライブラリはあるらしい) Goには言語レベルでGCが提供されているらしい。

GCが提供されているかどうかは言語のRuntimeによるところっぽい。

言語のRuntimeについて(想像)

各言語で書かれた処理がコンピュータで実行されるとき、実行の仕組みを提供している部分があると思っている。 これが処理系だとかRuntimeだとか実行系だとか呼んでいる部分だと思っている。 Javaの場合はJVMがこれを、RubyとかPyhonはインタプリタがこれを提供している感じ。

CやGoの場合は成果物(バイナリ)内にRuntimeが同梱されていて処理されていて、Goの場合はここにGCの機構も含まれているのでGCがある。 Cの場合はここにGCの機構が無いのでない。

という感じなんかな。

各言語のRuntime周りの情報が得られれば確認できると思うけど、どこを調べればいいのかよくわからない。コードを読む感じになるのだろうか