このモジュールは、循環ガベージコレクタの無効化・検出頻度の調整・デバッグ
オブションの設定などを行うインターフェースを提供します。また、検出した到
達不能オブジェクトのうち、解放する事ができないオブジェクトを参照する事も
できます。循環ガベージコレクタはPyhonの参照カウントを補うためのものです
ので、もしプログラム中で循環参照が発生しない事が明らかな場合には検出をす
る必要はありません。自動検出は、gc.disable()
で停止する事ができま
す。メモリリークをデバッグするときには、
gc.set_debug(gc.DEBUG_LEAK)
とします。
これは gc.DEBUG_SAVEALL
を含んでいることに注意しましょう。
ガベージとして検出されたオブジェクトは、インスペクション用に
gc.garbage に保存されます。
gcモジュールは、以下の関数を提供しています。
) |
) |
) |
[generation]) |
バージョン 2.5 で 変更 された仕様: オプションの引数 generation が追加されました
flags) |
sys.stderr
に出力されます。デバッグフラグは、下の値の組み合わせ
を指定する事ができます。
) |
) |
threshold0[, threshold1[, threshold2]]) |
GCは、オブジェクトを、走査された回数に従って3世代に分類します。新しいオ
ブジェクトは最も若い(0
世代)に分類されます。もし、そのオブジェク
トがガベージコレクションで削除されなければ、次に古い世代に分類されます。
もっとも古い世代は2
世代で、この世代に属するオブジェクトは他の世代
に移動しません。ガベージコレクタは、最後に検出を行ってから生成・削除した
オブジェクトの数をカウントしており、この数によって検出を開始します。オブ
ジェクトの生成数 - 削除数 がthreshold0より大きくなると、検出を開始
します。最初は0
世代のオブジェクトのみが検査されます。0
世代
の検査がthreshold1
回実行されると、1
世代のオブジェクトの検
査を行います。同様に、1
世代がthreshold2
回検査されると、
2
世代の検査を行います。
) |
(count0, count1, count2)
のタプルで返します。
バージョン 2.5 で 新たに追加 された仕様です。
) |
(threshold0, threshold1,
threshold2)
のタプルで返します。
*objs) |
尚、戻り値のリストには、すでに参照されなくなっているが、循環参照の一部で まだガベージコレクションで回収されていないオブジェクトも含まれるので注意 が必要です。有効なオブジェクトのみを取得する場合、 get_referrers()の前にcollect()を呼び出してくださ い。
get_referrers()から返されるオブジェクトは作りかけや 利用できない状態である場合があるので、利用する際には注意が必要です。 get_referrers()をデバッグ以外の目的で利用するのは避けてくだ さい。
バージョン 2.2 で 新たに追加 された仕様です。
*objs) |
以下の変数は読み込み専用です。(変更することはできますが、再バインドする 事はできません。)
__del__()メソッドを持つオブジェクトが循環参照に含まれている場
合、その循環参照全体と、循環参照からのみ到達する事ができるオブジェクトは
回収不能となります。このような場合には、Pythonは安全に__del__()
を呼び出す順番を決定する事ができないため、自動的に解放することはできませ
ん。もし安全な解放順序がわかるのであれば、garbageリストを参照して
循環参照を破壊する事ができます。循環参照を破壊した後でも、そのオブジェク
トはgarbageリストから参照されているため、解放されません。解放する
ためには、循環参照を破壊した後、del gc.garbage[:]
のように
garbageからオブジェクトを削除する必要があります。一般的には
__del__()を持つオブジェクトが循環参照の一部とはならないように配
慮し、garbageはそのような循環参照が発生していない事を確認するため
に利用する方が良いでしょう。
DEBUG_SAVEALLが設定されている場合、全ての到達不能オブジェクト は解放されずにこのリストに格納されます。
以下はset_debug()に指定することのできる定数です。
garbade
リストに追加されます。
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES |
DEBUG_OBJECTS | DEBUG_SAVEALL
と同じ。)