Pythonのガベージコレクションの仕組みを詳しく解説
参照カウント
Pythonのデフォルトのガベージコレクションメカニズムは「参照カウント」であり、各オブジェクトはob_refフィールドを維持します。その利点は、そのメカニズムが単純であることです。新しい参照がオブジェクトを指すと、参照カウントが 1 増加します。オブジェクトの参照が破棄されると、参照カウントが 1 減少します。オブジェクトの参照カウントは 0 になります。 、オブジェクトはすぐにリサイクルされ、占有されていたメモリが解放されます。欠点は、参照カウントを維持するために余分なスペースが必要なことですが、主な問題は「循環参照」を解決できないことです。
循環参照とは何ですか? 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 の参照カウントを減らし、a と b の参照カウントを削除します。2 つのオブジェクトにはそれぞれ他のオブジェクトへの参照が含まれているため、最後の 2 つのオブジェクトには名前でアクセスできません。参照カウントはゼロまで減っていません。したがって、このオブジェクトは破棄されず、常にメモリ内に常駐するため、メモリ リークが発生します。循環参照の問題を解決するために、Python ではマークスイープと世代別コレクションという 2 つの GC メカニズムが導入されました。
マーク スイープ
マーク スイープは、トレース リサイクル技術に基づいたガベージ コレクション アルゴリズムです。オブジェクトは参照 (ポインター) を介して接続され、オブジェクトのノードが有向グラフを構成し、参照関係がエッジを構成します。有向グラフ。ルート オブジェクトから開始して、オブジェクトは有向エッジに沿って走査され、到達可能なオブジェクトは有用なオブジェクトとしてマークされ、到達不可能なオブジェクトはクリアされるオブジェクトになります。いわゆるルート オブジェクトは、一部のグローバル参照オブジェクトと関数スタック内の参照であり、これらの参照によって参照されるオブジェクトは削除できません。
Python の補助ガベージ コレクション テクノロジとして、マーク クリア アルゴリズムは主にリスト、辞書、タプル、インスタンスなどの一部のコンテナ オブジェクトを処理します。これは、文字列や数値オブジェクトに対して循環参照の問題を引き起こすことが不可能であるためです。 Python では、二重リンク リストを使用してこれらのコンテナ オブジェクトを整理します。
世代リサイクル
世代リサイクルは、オブジェクトの生存時間に基づいてメモリを異なるコレクションに分割する操作方法です。Python は、メモリを 3 つの「世代」と呼びます。それぞれ、若い世代 (第 0 世代)、中間世代 (第 1 世代)、古い世代 (第 2 世代) に対応し、オブジェクトの生存時間が減少するにつれて、ガベージ コレクションの頻度が増加します。新しく作成されたオブジェクトは若い世代に割り当てられ、若い世代のリンク リストの合計数が上限に達すると、Python ガベージ コレクション メカニズムがトリガーされ、リサイクルできるオブジェクトとリサイクルされないオブジェクトがリサイクルされます。古い時代のオブジェクトは、システム全体のライフサイクルの中でも最も長く生き残ったオブジェクトです。同時に、世代別リサイクルはマークアンドスイープ技術に基づいています。
世代リサイクルは、コンテナ オブジェクトを処理するための Python の補助的なガベージ コレクション テクノロジとしても機能します

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Pythonパラメーター注釈の代替使用Pythonプログラミングでは、パラメーターアノテーションは、開発者が機能をよりよく理解して使用するのに役立つ非常に便利な機能です...

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトを書くときは、以前の出力をカーソル位置にクリアするのが一般的です...

なぜ私のコードはAPIによってデータを返しているのですか?プログラミングでは、APIが呼び出すときにヌル値を返すという問題に遭遇することがよくあります。

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...
