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で変更:オプションの生成引数が追加されました。
- 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
が検査されてから世代0
が threshold1 回以上検査された場合、世代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__()
メソッドを持つものだけでなく、到達不能なサイクルのすべてのインスタンスオブジェクトが含まれていました。