GCについて勉強してみる。(第1回)

Rubyist九州でid:autherNariid:authorNari(ID間違えてた。ごめんなさい。2008.3.16 12:14)さんのGC愛を目の当たりにした俺は自分もGCを勉強してみることにした。

GCとは何か

  • 必要のないメモリ領域(以下「メモリ」)を開放すること
  • →では「必要のないメモリ」とはどういう状態にあるメモリなのか
    • 「必要なメモリ」以外の、オブジェクトが格納されたメモリ(オブジェクトが格納されていないメモリは開放する必要もない)
  • →「必要なメモリ」とは何か
    1. 「確実に必要なオブジェクト」が格納されているメモリ
    2. 「確実に必要なオブジェクト」から参照されたオブジェクトが格納されているメモリ
    3. そのオブジェクトから参照されたオブジェクトが格納されているメモリ
    4. さらにその(略)..といった具合にずーっとたどっていけるオブジェクトが格納されたすべてのメモリ
  • →で、「確実に必要なオブジェクト」とは何か
    1. グローバル変数から指されているオブジェクト
    2. 定数から指されているオブジェクト
    3. スタックから指されているオブジェクト
    4. レジスタから指されているオブジェクト
  • この、「確実に必要なオブジェクト」のことをGCの専門用語では「GCのルート(root)」と呼ぶ。(単に「ルート」とも言う)
  • つまり、ルートからたどれないオブジェクトが格納されたメモリは「必要のないメモリ」であり、このメモリを開放することがGCである。
用語
スタック
局所変数や関数呼び出しの履歴などが格納されるメモリ領域。(話をごく簡単にすると) 関数呼び出しが起こると伸びて、return が起こると縮む。
レジスタ
CPUの中にあるメモリみたいな部分。関数の引数、計算の途中結果など様々な値を格納する。オブジェクトを指すポインタが格納されている可能性もある。
ヒープ
自由な順番でメモリ領域を確保/解放できる領域。オブジェクトはヒープに作成される。つまり、GCはヒープに対して行われる。

参考文献

http://wiki.livedoor.jp/author_nari/d/GC
http://i.loveruby.net/ja/rhg/book/gc.html

今日はとりあえずここまで。とりあえず参考文献の最後までを自分の言葉で言いかえていく作業を続けてみようと思う。(一部丸写しだけど)wikiのほうはこれから増えるかもしれないけど。まあ頑張る。