28.12. gc —ガベージコレクターインターフェイス—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/gc
移動先:案内検索

28.12。 gc —ガベージコレクタインターフェイス

このモジュールは、オプションのガベージコレクターへのインターフェイスを提供します。 コレクターを無効にし、収集頻度を調整し、デバッグオプションを設定する機能を提供します。 また、コレクターが検出したが解放できない到達不能オブジェクトへのアクセスも提供します。 コレクターはPythonですでに使用されている参照カウントを補足するため、プログラムが参照サイクルを作成しないことが確実な場合は、コレクターを無効にすることができます。 gc.disable()を呼び出すと、自動収集を無効にできます。 リークしているプログラムをデバッグするには、gc.set_debug(gc.DEBUG_LEAK)を呼び出します。 これにはgc.DEBUG_SAVEALLが含まれているため、ガベージコレクションされたオブジェクトが検査のためにgc.garbageに保存されることに注意してください。

gc モジュールは、次の機能を提供します。

gc.enable()
自動ガベージコレクションを有効にします。
gc.disable()
自動ガベージコレクションを無効にします。
gc.isenabled()
自動収集が有効になっている場合はtrueを返します。
gc.collect([generation])

引数なしで、完全なコレクションを実行します。 オプションの引数 generation は、収集する世代(0から2)を指定する整数にすることができます。 世代番号が無効な場合、ValueErrorが発生します。 検出された到達不能オブジェクトの数が返されます。

バージョン2.5で変更:オプションの生成引数が追加されました。

バージョン2.6で変更:完全なコレクションまたは最上位世代(2)のコレクションが実行されるたびに、多数の組み込みタイプに対して維持されている空きリストがクリアされます。 特定の実装、特に intfloat のために、一部のフリーリストのすべてのアイテムが解放されるとは限りません。

gc.set_debug(flags)
ガベージコレクションのデバッグフラグを設定します。 デバッグ情報はsys.stderrに書き込まれます。 ビット演算を使用して組み合わせてデバッグを制御できるデバッグフラグのリストについては、以下を参照してください。
gc.get_debug()
現在設定されているデバッグフラグを返します。
gc.get_objects()

返されたリストを除く、コレクターによって追跡されたすべてのオブジェクトのリストを返します。

バージョン2.2の新機能。

gc.set_threshold(threshold0[, threshold1[, threshold2]])

ガベージコレクションのしきい値(収集頻度)を設定します。 threshold0 をゼロに設定すると、収集が無効になります。

GCは、オブジェクトが存続したコレクションスイープの数に応じて、オブジェクトを3世代に分類します。 新しいオブジェクトは、最も若い世代(世代0)に配置されます。 オブジェクトがコレクションを生き残った場合、そのオブジェクトは次の古い世代に移動されます。 世代2は最も古い世代であるため、その世代のオブジェクトはコレクション後もそこに残ります。 いつ実行するかを決定するために、コレクターは、最後の収集以降のオブジェクトの割り当てと割り当て解除の数を追跡します。 割り当て数から割り当て解除数を引いた数が threshold0 を超えると、収集が開始されます。 最初は、世代0のみが検査されます。 世代1が検査されてから世代0threshold1 回以上検査された場合、世代1も検査されます。 同様に、 threshold2 は、世代2を収集する前に、世代1の収集数を制御します。

gc.get_count()

現在のコレクションカウントを(count0, count1, count2)のタプルとして返します。

バージョン2.5の新機能。

gc.get_threshold()
現在の収集しきい値を(threshold0, threshold1, threshold2)のタプルとして返します。
gc.get_referrers(*objs)

オブジェクトのいずれかを直接参照するオブジェクトのリストを返します。 この関数は、ガベージコレクションをサポートするコンテナのみを検索します。 他のオブジェクトを参照しているがガベージコレクションをサポートしていない拡張タイプは見つかりません。

すでに逆参照されているが、サイクルで存在し、ガベージコレクターによってまだ収集されていないオブジェクトは、結果のリファラーの中にリストされる可能性があることに注意してください。 現在ライブオブジェクトのみを取得するには、 get_referrers()を呼び出す前に collect()を呼び出します。

get_referrers()によって返されたオブジェクトを使用する場合は注意が必要です。オブジェクトの一部はまだ作成中であり、一時的に無効な状態になっている可能性があるためです。 デバッグ以外の目的で get_referrers()を使用することは避けてください。

バージョン2.2の新機能。

gc.get_referents(*objs)

引数のいずれかによって直接参照されるオブジェクトのリストを返します。 返される指示対象は、引数のCレベル tp_traverse メソッド(存在する場合)によってアクセスされるオブジェクトであり、実際に直接到達可能なすべてのオブジェクトであるとは限りません。 tp_traverse メソッドは、ガベージコレクションをサポートするオブジェクトによってのみサポートされ、サイクルに関与している可能性のあるオブジェクトにアクセスするためにのみ必要です。 したがって、たとえば、整数が引数から直接到達可能である場合、その整数オブジェクトは結果リストに表示される場合と表示されない場合があります。

バージョン2.3の新機能。

gc.is_tracked(obj)

オブジェクトが現在ガベージコレクターによって追跡されている場合はTrueを返し、それ以外の場合はFalseを返します。 原則として、アトミック型のインスタンスは追跡されず、非アトミック型のインスタンス(コンテナー、ユーザー定義オブジェクトなど)は追跡されます。 ただし、単純なインスタンスのガベージコレクタのフットプリントを抑制するために、いくつかのタイプ固有の最適化が存在する場合があります(例: アトミックキーと値のみを含むdict):

>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

バージョン2.7の新機能。

次の変数は、読み取り専用アクセス用に提供されています(値を変更することはできますが、再バインドしないでください)。

gc.garbage

コレクターが到達不能であることが判明したが解放できなかったオブジェクトのリスト(収集不可能なオブジェクト)。 デフォルトでは、このリストには__del__()メソッドを持つオブジェクトのみが含まれます。 1 __del__()メソッドを持ち、参照サイクルの一部であるオブジェクトは、必ずしもサイクル内にあるとは限らないが、そこからのみ到達可能なオブジェクトを含め、参照サイクル全体を収集できなくなります。 一般に、Pythonが__del__()メソッドを実行する安全な順序を推測することはできないため、Pythonはそのようなサイクルを自動的に収集しません。 安全な順序がわかっている場合は、ガベージリストを調べ、リスト内のオブジェクトが原因でサイクルを明示的に中断することで、問題を強制できます。 これらのオブジェクトは、ガベージリストに含まれているため、存続しているため、ガベージからも削除する必要があります。 たとえば、サイクルを中断した後、del gc.garbage[:]を実行してリストを空にします。 一般に、__del__()メソッドを使用してオブジェクトを含むサイクルを作成しないことで問題を回避することをお勧めします。その場合、ガベージを調べて、そのようなサイクルが作成されていないことを確認できます。

DEBUG_SAVEALL が設定されている場合、到達不能なすべてのオブジェクトは解放されるのではなく、このリストに追加されます。

set_debug()で使用するために、次の定数が提供されています。

gc.DEBUG_STATS
収集中に統計を出力します。 この情報は、収集頻度を調整するときに役立ちます。
gc.DEBUG_COLLECTABLE
見つかった収集可能なオブジェクトに関する情報を印刷します。
gc.DEBUG_UNCOLLECTABLE
見つかった収集不可能なオブジェクト(到達できないが、コレクターが解放できないオブジェクト)の情報を出力します。 これらのオブジェクトはgarbageリストに追加されます。
gc.DEBUG_INSTANCES
DEBUG_COLLECTABLE または DEBUG_UNCOLLECTABLE が設定されている場合、見つかったインスタンスオブジェクトに関する情報を出力します。
gc.DEBUG_OBJECTS
DEBUG_COLLECTABLE または DEBUG_UNCOLLECTABLE が設定されている場合、見つかったインスタンスオブジェクト以外のオブジェクトに関する情報を出力します。
gc.DEBUG_SAVEALL
設定すると、検出された到達不能なオブジェクトはすべて、解放されるのではなく、ガベージに追加されます。 これは、リークしているプログラムのデバッグに役立ちます。
gc.DEBUG_LEAK
コレクターがリークしているプログラムに関する情報を出力するために必要なデバッグフラグ(DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES | DEBUG_OBJECTS | DEBUG_SAVEALLに等しい)。

脚注

1
Python 2.2より前のリストには、__del__()メソッドを持つものだけでなく、到達不能なサイクルのすべてのインスタンスオブジェクトが含まれていました。