Pythonのガーベッジコレクションの話
以前、「JavaのGCについてメモ - public static void main」でGCについて調べたとき、RubyのGCの実装方法はわかったのですが、Pythonについて調べていなかったので、少し調べてみました。
「http://www.python.jp/doc/2.4/ext/refcounts.html」によると、Pythonでは以下の二つの手法を使っています。
- 参照カウント法 ・・・ オブジェクトが自身がどれだけ参照されているかをカウントし、参照が0になったらメモリを解放。
- Mark&Sweep ・・・ ポインタを全走査し、参照されているオブジェクトに印付け(Mark)する。すべて走査し終わった後に、印がついていないものを解放(Sweep)する。
参照カウント法を主に使っているのですが、この方法の問題点として、循環参照をしている場合メモリリークが発生する可能性があるということです。
これに対処するために、循環参照検出機構というものが存在しており、適当なタイミングでMark&Sweepを使ってGCしているようです。ただ、循環参照検出機構がどのタイミングで実行されるかについてはよくわかりませんでした。
普通にPythonを使っているときには、GCについて意識する必要はありませんが、C言語で拡張モジュールを書く場合に、参照カウントを意識して実装する必要があります。