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

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

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(generation=None)

返されたリストを除いて、コレクターによって追跡されたすべてのオブジェクトのリストを返します。 Generation がNoneでない場合は、その世代にあるコレクターによって追跡されたオブジェクトのみを返します。

バージョン3.8で変更:新しい世代パラメーター。

gc.get_stats()

インタプリタの開始以降のコレクション統計を含む3つの世代ごとの辞書のリストを返します。 キーの数は将来変更される可能性がありますが、現在、各辞書には次の項目が含まれています。

  • collectionsは、この世代が収集された回数です。

  • collectedは、この世代内で収集されたオブジェクトの総数です。

  • uncollectableは、この世代内で収集できないことが判明した(したがって、ガベージリストに移動された)オブジェクトの総数です。

バージョン3.4の新機能。

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

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

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

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)
引数のいずれかによって直接参照されるオブジェクトのリストを返します。 返される指示対象は、引数のCレベル 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.freeze()

gcによって追跡されたすべてのオブジェクトをフリーズします-それらを永続的な世代に移動し、将来のすべてのコレクションを無視します。 これは、POSIX fork()呼び出しの前に使用して、gcのコピーオンライトを使いやすくしたり、収集を高速化したりできます。 また、POSIX fork()呼び出しの前に収集すると、将来の割り当てのためにページが解放され、コピーオンライトが発生する可能性があるため、親プロセスでgcを無効にし、forkの前にフリーズして子プロセスでgcを有効にすることをお勧めします。

バージョン3.7の新機能。

gc.unfreeze()

永続世代のオブジェクトのフリーズを解除し、最も古い世代に戻します。

バージョン3.7の新機能。

gc.get_freeze_count()

永続世代のオブジェクトの数を返します。

バージョン3.7の新機能。

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

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

ガベージコレクターによって収集の前後に呼び出されるコールバックのリスト。 コールバックは、 phaseinfo の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に等しい)。