29.11。 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=2)
引数なしで、完全なコレクションを実行します。 オプションの引数 generation は、収集する世代(0から2)を指定する整数にすることができます。 世代番号が無効な場合、 ValueError が発生します。 検出された到達不能オブジェクトの数が返されます。
多数の組み込み型に対して維持されているフリーリストは、完全なコレクションまたは最上位世代(2)のコレクションが実行されるたびにクリアされます。 特定の実装、特に float のために、一部のフリーリストのすべてのアイテムが解放されるとは限りません。
- gc.set_debug(flags)
- ガベージコレクションのデバッグフラグを設定します。 デバッグ情報は
sys.stderr
に書き込まれます。 ビット演算を使用して組み合わせてデバッグを制御できるデバッグフラグのリストについては、以下を参照してください。
- gc.get_debug()
- 現在設定されているデバッグフラグを返します。
- gc.get_objects()
- 返されたリストを除く、コレクターによって追跡されたすべてのオブジェクトのリストを返します。
- gc.get_stats()
インタプリタの開始以降のコレクション統計を含む3つの世代ごとの辞書のリストを返します。 キーの数は将来変更される可能性がありますが、現在、各辞書には次の項目が含まれています。
collections
は、この世代が収集された回数です。collected
は、この世代内で収集されたオブジェクトの総数です。uncollectable
は、この世代内で収集できないことが判明した(したがって、ガベージリストに移動された)オブジェクトの総数です。
バージョン3.4の新機能。
- 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)
のタプルとして返します。
- gc.get_threshold()
- 現在の収集しきい値を
(threshold0, threshold1, threshold2)
のタプルとして返します。
- gc.get_referrers(*objs)
オブジェクトのいずれかを直接参照するオブジェクトのリストを返します。 この関数は、ガベージコレクションをサポートするコンテナのみを検索します。 他のオブジェクトを参照しているがガベージコレクションをサポートしていない拡張タイプは見つかりません。
すでに逆参照されているが、サイクルで存在し、ガベージコレクターによってまだ収集されていないオブジェクトは、結果のリファラーの中にリストされる可能性があることに注意してください。 現在ライブオブジェクトのみを取得するには、 get_referrers()を呼び出す前に collect()を呼び出します。
get_referrers()によって返されるオブジェクトを使用する場合は注意が必要です。オブジェクトの一部はまだ作成中であり、一時的に無効な状態になっている可能性があるためです。 デバッグ以外の目的で get_referrers()を使用することは避けてください。
- gc.get_referents(*objs)
- 引数のいずれかによって直接参照されるオブジェクトのリストを返します。 返される指示対象は、引数の経営幹部レベルの tp_traverse メソッド(存在する場合)によってアクセスされるオブジェクトであり、実際に直接到達できるすべてのオブジェクトであるとは限りません。 tp_traverse メソッドは、ガベージコレクションをサポートするオブジェクトによってのみサポートされ、サイクルに関与する可能性のあるオブジェクトにアクセスするためにのみ必要です。 したがって、たとえば、整数が引数から直接到達可能である場合、その整数オブジェクトは結果リストに表示される場合と表示されない場合があります。
- 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
バージョン3.1の新機能。
次の変数は、読み取り専用アクセス用に提供されています(値を変更することはできますが、再バインドしないでください)。
- gc.garbage
コレクターが到達不能であることが判明したが解放できなかったオブジェクトのリスト(収集不可能なオブジェクト)。 Python 3.4以降、このリストは、NULL以外の
tp_del
スロットを持つC拡張タイプのインスタンスを使用する場合を除いて、ほとんどの場合空になっているはずです。DEBUG_SAVEALL が設定されている場合、到達不能なすべてのオブジェクトは解放されるのではなく、このリストに追加されます。
バージョン3.2で変更:このリストがインタープリターのシャットダウンで空でない場合、 ResourceWarning が発行され、デフォルトではサイレントです。 DEBUG_UNCOLLECTABLE が設定されている場合、さらにすべての収集不可能なオブジェクトが出力されます。
バージョン3.4で変更: PEP 442 に続いて、
__del__()
メソッドを持つオブジェクトは gc.garbage [になりませんX132X]もう。
- gc.callbacks
ガベージコレクターによって収集の前後に呼び出されるコールバックのリスト。 コールバックは、 phase と info の2つの引数で呼び出されます。
phase は、次の2つの値のいずれかになります。
「開始」:ガベージコレクションが開始されようとしています。
「停止」:ガベージコレクションが終了しました。
info は、コールバックの詳細情報を提供するdictです。 現在、次のキーが定義されています。
「世代」:収集されている最も古い世代。
「収集済み」:フェーズが「停止」の場合、正常に収集されたオブジェクトの数。
「収集不能」:フェーズが「停止」の場合、収集できず、ガベージに入れられたオブジェクトの数。
アプリケーションは、独自のコールバックをこのリストに追加できます。 主な使用例は次のとおりです。
さまざまな世代が収集される頻度や収集にかかる時間など、ガベージコレクションに関する統計を収集します。
アプリケーションがガベージに表示されたときに、収集できないタイプを識別してクリアできるようにします。
バージョン3.3の新機能。
set_debug()で使用するために、次の定数が提供されています。
- gc.DEBUG_STATS
- 収集中に統計を出力します。 この情報は、収集頻度を調整するときに役立ちます。
- gc.DEBUG_COLLECTABLE
- 見つかった収集可能なオブジェクトに関する情報を印刷します。
- gc.DEBUG_UNCOLLECTABLE
見つかった収集不可能なオブジェクト(到達できないが、コレクターが解放できないオブジェクト)の情報を出力します。 これらのオブジェクトは
garbage
リストに追加されます。バージョン3.2で変更: ガベージリストの内容も、空でない場合はインタープリターシャットダウンで出力します。
- gc.DEBUG_SAVEALL
- 設定すると、検出された到達不能なオブジェクトはすべて、解放されるのではなく、ガベージに追加されます。 これは、リークしているプログラムのデバッグに役立ちます。
- gc.DEBUG_LEAK
- コレクターがリークしているプログラムに関する情報を出力するために必要なデバッグフラグ(
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL
に等しい)。