ホームページ  >  記事  >  バックエンド開発  >  Python ガベージ コレクション メカニズムの詳細な紹介

Python ガベージ コレクション メカニズムの詳細な紹介

高洛峰
高洛峰オリジナル
2017-03-19 15:19:041451ブラウズ

リファレンスカウント

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

Mark-Sweet は、トレース リサイクル技術に基づいたガベージ コレクション アルゴリズムです。オブジェクトは参照 (ポインター) を介して接続され、この有向グラフのノードを構成し、参照関係がエッジを構成します。この有向グラフの。ルート オブジェクト (ルート オブジェクト) から開始して、有向エッジ に沿ってオブジェクト をトラバースします。到達可能なオブジェクトは有用なオブジェクトとしてマークされ、到達不可能なオブジェクトはクリアされるオブジェクトです。いわゆるルート オブジェクトは、一部のグローバル参照オブジェクトと関数スタック内の参照であり、これらの参照によって参照されるオブジェクトは削除できません。 Python の補助ガベージ コレクション テクノロジとしてのマーク スイープ アルゴリズムは、

文字列

や数値オブジェクトに対して循環参照の問題を引き起こすことが不可能であるため、主に list、dict、タプル、インスタンスなどの一部のコンテナ オブジェクトを扱います。 Python では、二重リンク リストを使用してこれらのコンテナ オブジェクトを整理します。 世代リサイクル

世代リサイクルは、オブジェクトの生存時間に基づいてメモリを異なるコレクションに分割する操作方法です。Python は、メモリを 3 つの世代に分割します。 「若い世代 (世代 0)、中間の世代 (世代 1)、古い世代 (世代 2) です。これらは 3 つのリンク リストに対応します。それらのガベージ コレクションの頻度は、オブジェクトの生存時間とともに増加します。そして減少。新しく作成されたオブジェクトは若い世代に割り当てられ、若い世代のリンク リストの合計数が上限に達すると、Python ガベージ コレクション メカニズムがトリガーされ、リサイクルできるオブジェクトとリサイクルされないオブジェクトがリサイクルされます。古い時代のオブジェクトは、システム全体の

ライフサイクル

の中でも最も長く生き残ったオブジェクトです。同時に、世代別リサイクルはマークアンドスイープ技術に基づいています。 世代リサイクルは、コンテナ オブジェクトを処理するための Python の補助ガベージ コレクション テクノロジとしても機能します

以上がPython ガベージ コレクション メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。