ホームページ バックエンド開発 Python チュートリアル Python のガベージ コレクション メカニズムの詳細な分析

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

Jun 16, 2016 am 08:43 AM
python ガベージコレクション

1. 概要:

Python の GC モジュールは主に「参照カウント」を使用してガベージを追跡し、リサイクルします参照カウントに基づいて、「マーク アンド スイープ」 を通じてコン​​テナ オブジェクトによって生成される循環参照の問題も解決できます。 「世代別コレクション」を使用してスペースと時間を交換し、ガベージ コレクションの効率をさらに向上させます

2. 参照数

Python では、ほとんどのオブジェクトのライフサイクルは、オブジェクトの参照カウントを通じて管理されます。広い意味では、参照カウントもガベージ コレクション メカニズムであり、最も直観的でシンプルなガベージ コレクション テクノロジでもあります。

原則: オブジェクトへの参照が作成またはコピーされると、オブジェクトの参照カウントは 1 ずつ増加し、オブジェクトの参照が破棄されると、オブジェクトの参照カウントは 0 に減らされます。 , これは、オブジェクトが誰からも使用されなくなり、そのオブジェクトが占有していたメモリを解放できることを意味します。
メモリの割り当てと解放のたびに参照カウントを管理するには、参照カウントを追加する必要がありますが、他の主流のガベージ コレクション テクノロジと比較して、参照カウントには最大の利点の 1 つがあります。それは、メモリがなくなったら「リアルタイム」であるということです。それを指す参照はすぐにリサイクルされます。他のガベージ コレクション カウントは、無効なメモリをリサイクルできる前に、特定の特殊な条件 (メモリ割り当ての失敗など) に達する必要があります。

参照カウント メカニズムの実行効率の問題: 参照カウント メカニズムによって発生する参照カウントを維持するための追加操作は、メモリの割り当てと解放、および Python の実行中に実行される参照割り当ての数に正比例します。 「マーククリア」や「ストップコピー」などの他の主流のガベージ コレクション メカニズムと比較すると、これらのテクノロジによって生じる追加の操作は基本的にリサイクルされるメモリの量にのみ関係するため、これは弱点となります。
実行効率が参照カウント メカニズムの単なる弱点である場合、残念なことに、参照カウント メカニズムには依然として致命的な弱点があり、まさにこの弱点のため、騎士道的なガベージ コレクションには参照カウントが含まれていない可能性があります。これは循環参照 (相互参照とも呼ばれます) です。

問題の説明:

循環参照により、オブジェクトのグループの参照カウントがゼロ以外になることがあります。ただし、これらのオブジェクトは実際には外部オブジェクトから参照されず、相互に参照するだけです。これは、このオブジェクトのグループをもう誰も使用しないことを意味し、このオブジェクトのグループが占有しているメモリ空間はリサイクルされる必要があります。その後、相互参照の存在により、各オブジェクトの参照カウントが 0 にならず、メモリが占​​有されます。これらのオブジェクトは決して解放されません。例:

a = []
b = []
a.append(b)
b.append(a)
print a
[[[…]]]
print b
[[[…]]]
ログイン後にコピー

これは致命的であり、手動メモリ管理によって引き起こされるメモリ リークと何ら変わりません。
この問題を解決するために、Python は参照カウントの欠点を補う他のガベージ コレクション メカニズム、つまり「マーク スイープ」と「世代別コレクション」という 2 つのコレクション テクノロジを導入しました。

3. マーククリア

「Mark-Clear」は循環参照の問題を解決するものです。他のオブジェクト (リスト、セット、辞書、クラス、インスタンスなど) への参照を含む可能性のあるコンテナ オブジェクトは、循環参照を生成する可能性があります。
2 つのオブジェクトの参照カウントが両方とも 1 であっても、それらの間に循環参照しかない場合は、両方のオブジェクトをリサイクルする必要があるという事実を認識する必要があります。つまり、それらの参照カウントは非ゼロとして表示されます。ただし、実際の有効な参照数は 0 です。まず循環参照を削除する必要があります。そうすれば、これら 2 つのオブジェクトの有効な数が表示されます。 2 つのオブジェクトが A と B であるとします。B への参照があるため、A から開始し、B の参照カウントを 1 つ減らしてから B に到達します。B には A への参照があるためです。 A の参照も 1 減算されます。このようにして、円形参照オブジェクト間のリングの削除が完了します。
しかし、問題があります。オブジェクト A に C へのオブジェクト参照があるが、C は A を参照していないとします。C の参照カウントが 1 減算され、A が最終的にリサイクルされなかった場合、明らかに、誤って参照を減分したことになります。 C を 1 ずつカウントします。これにより、将来のある時点で C へのダングリング参照が発生します。このため、A を削除せずに C の参照カウントを復元する必要があります。このような解決策を採用すると、参照カウントの維持の複雑さが指数関数的に増加します。

原則: 「Mark-Clear」は、実際の参照カウントを変更するのではなく、コレクション内のオブジェクトの参照カウントのコピーを作成し、オブジェクトによって参照されるコピーを変更する、より良いアプローチを採用します。コピーに加えられた変更は、オブジェクトの寿命の維持には影響しません。
このカウント コピーの唯一の目的は、ルート オブジェクト コレクションを見つけることです (このコレクション内のオブジェクトはリサイクルできません)。ルート オブジェクト セットが正常に見つかると、現在のメモリ リンク リストがまず 2 つに分割され、一方のリンク リストはルート オブジェクト セットを保持してルート リンク リストになり、もう一方のリンク リストは残りのオブジェクトを保持して到達不能リンク リストになります。 。 2 つのリンク リストに分割される理由は、次の考慮事項に基づいています。現在の到達不可能なオブジェクトには、ルート リンク リスト内のオブジェクトが含まれている可能性があり、これらのオブジェクトはプロセス内でマークされるとリサイクルできません。そのようなオブジェクトが見つかった場合は、そのオブジェクトを到達不能リンク リストからルート リンク リストに移動します。マーキングが完了すると、到達不能リンク リスト内の残りのオブジェクトはすべて真のガベージ オブジェクトとなり、その後のガベージ コレクションは制限するだけで済みます。到達不能なリンクリストにアクセスするだけです。

4. 世代別リサイクル

背景: 世代別ガベージ コレクション テクノロジは、1980 年代初頭に開発されたガベージ コレクション メカニズムです。開発に使用される言語、種類、サイズに関係なく。プログラムに関しては、すべてに 1 つの共通点があります。つまり、特定の割合のメモリ ブロックのライフ サイクルは比較的短く、通常は数百万のマシン命令ですが、残りのメモリ ブロックのライフ サイクルは比較的長く、プログラムの開始から終了まで続く場合もあります。
「マーククリア」などの以前のガベージ コレクション メカニズムから判断すると、 このガベージ コレクション メカニズムによってもたらされる追加の操作は、実際にはシステム内のメモリ ブロックの総数に関係しています。逆に、リサイクルするメモリ ブロックが少ない場合は、ガベージ検出の方が追加のアクション よりも追加の操作が少なくなります。ガベージ コレクションの効率を向上させるために、「スペース フォー タイム戦略」が採用されています。

原則: システム内のすべてのメモリ ブロックを、その生存時間に応じて異なるコレクションに分割します。各コレクションは、「世代」の生存時間が増加するにつれて、ガベージ コレクションの頻度が減少します。言い換えれば、オブジェクトの存続期間が長ければ長いほど、そのオブジェクトがガベージになる可能性は低くなり、そのオブジェクトに対するガベージ コレクションの頻度を減らす必要があります。この生存時間はどのように測定するか: 通常、オブジェクトがより多くのガベージ コレクションを実行した場合、そのオブジェクトの生存時間は長くなると結論付けることができます。

例:

3 回のガベージ コレクション後にメモリ ブロック M がまだ残っている場合、メモリ ブロック M をセット A に分割し、新しく割り当てられたメモリはセット B に分割します。ガベージ コレクションが機能し始めると、ほとんどの場合、コレクション B のみがガベージ コレクションされ、長時間経過後にコレクション A がガベージ コレクションされます。これにより、ガベージ コレクション メカニズムが処理する必要のあるメモリが減り、当然効率が向上します。このプロセスでは、セット B の一部のメモリ ブロックは、生存時間が長いためセット A に転送されます。もちろん、実際にはセット A にいくつかのガベージがあり、これらのガベージの収集はこの世代メカニズムによるものです。遅れました。
Python には合計 3 つの「世代」があり、これは Python が実際に 3 つのリンク リストを維持することを意味します。詳細については、Python ソース コードを参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Dockerの原則の詳細な説明 Dockerの原則の詳細な説明 Apr 14, 2025 pm 11:57 PM

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

Visual StudioコードはPythonで使用できますか Visual StudioコードはPythonで使用できますか Apr 15, 2025 pm 08:18 PM

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

ターミナルVSCODEでプログラムを実行する方法 ターミナルVSCODEでプログラムを実行する方法 Apr 15, 2025 pm 06:42 PM

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

VSCODE拡張機能は悪意がありますか? VSCODE拡張機能は悪意がありますか? Apr 15, 2025 pm 07:57 PM

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

Python:自動化、スクリプト、およびタスク管理 Python:自動化、スクリプト、およびタスク管理 Apr 16, 2025 am 12:14 AM

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

Windows 8でコードを実行できます Windows 8でコードを実行できます Apr 15, 2025 pm 07:24 PM

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

See all articles