ホームページ >バックエンド開発 >Python チュートリアル >Python ガベージ コレクション メカニズムの詳細な紹介
Pythonデフォルトのガベージコレクションメカニズムは「リファレンスカウント」であり、各オブジェクトはob_refフィールドを維持します。その利点は、そのメカニズムが単純であることです。新しい参照がオブジェクトを指すと、参照カウントが 1 増加します。オブジェクトの参照が破棄されると、参照カウントが 1 減少します。オブジェクトの参照カウントは 0 になります。 、オブジェクトはすぐにリサイクルされ、占有されていたメモリが解放されます。欠点は参照カウントを維持するために余分なスペースが必要なことですが、主な問題は「cyclicreferences」を解決できないことです。
循環参照とは何ですか? A と B は相互に参照しており、A または B への外部参照はありません。それらの参照カウントは両方とも 1 ですが、明らかにリサイクルされる必要があります。 例:
a = { } # a 的引用为 1 b = { } # b 的引用为 1 a['b'] = b # b 的引用增 1,b的引用为2 b['a'] = a # a 的引用增 1,a的引用为 2 del a # a 的引用减 1,a的引用为 1 del b # b 的引用减 1, b的引用为 1
この例では、del ステートメントは a と b を削減します。参照カウントが削除され、参照に使用された変数名が削除されます。ただし、2 つのオブジェクトにはそれぞれ他のオブジェクトへの参照が含まれているため、最後の 2 つのオブジェクトには名前でアクセスできませんが、参照カウントは 0 には減りません。 。したがって、このオブジェクトは破棄されず、常にメモリ内に常駐するため、メモリ リークが発生します。循環参照の問題を解決するために、Python ではマークスイープと世代別コレクションという 2 つの GC メカニズムが導入されました。
Mark-Sweet は、トレース リサイクル技術に基づいたガベージ コレクション アルゴリズムです。オブジェクトは参照 (ポインター) を介して接続され、この有向グラフのノードを構成し、参照関係がエッジを構成します。この有向グラフの。ルート オブジェクト (ルート オブジェクト) から開始して、有向エッジ に沿ってオブジェクト をトラバースします。到達可能なオブジェクトは有用なオブジェクトとしてマークされ、到達不可能なオブジェクトはクリアされるオブジェクトです。いわゆるルート オブジェクトは、一部のグローバル参照オブジェクトと関数スタック内の参照であり、これらの参照によって参照されるオブジェクトは削除できません。 Python の補助ガベージ コレクション テクノロジとしてのマーク スイープ アルゴリズムは、
文字列や数値オブジェクトに対して循環参照の問題を引き起こすことが不可能であるため、主に list、dict、タプル、インスタンスなどの一部のコンテナ オブジェクトを扱います。 Python では、二重リンク リストを使用してこれらのコンテナ オブジェクトを整理します。 世代リサイクル
の中でも最も長く生き残ったオブジェクトです。同時に、世代別リサイクルはマークアンドスイープ技術に基づいています。 世代リサイクルは、コンテナ オブジェクトを処理するための Python の補助ガベージ コレクション テクノロジとしても機能します
以上がPython ガベージ コレクション メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。