ホームページ > バックエンド開発 > Python チュートリアル > Python ガベージ コレクション: 知っておくべきことすべて

Python ガベージ コレクション: 知っておくべきことすべて

DDD
リリース: 2025-01-18 00:15:08
オリジナル
674 人が閲覧しました

Python Garbage Collection: Everything You Need to Know

私。 ガベージ コレクションの詳細

コンピューター サイエンスの分野では、ガベージ コレクション (GC) は重要な自動メモリ管理技術です。 プログラムによって使用されなくなったメモリ領域を再利用し、オペレーティング システムに返します。このプロセスでは、さまざまなアルゴリズムを利用して、未使用のメモリを効率的に特定して削除します。

GC はプログラマの作業負荷を大幅に軽減し、プログラミング エラーを最小限に抑えます。 その起源は LISP プログラミング言語に遡ります。 現在、Smalltalk、Java、C#、Go、D などの多数の言語にガベージ コレクション メカニズムが組み込まれています。

最新のプログラミング言語のメモリ管理の基礎として、GC の主な機能は 2 つあります。

  • 未使用のメモリ リソース (ゴミ) を特定し、特定します。
  • このゴミをクリアし、他のオブジェクト用にメモリを解放します。

この自動化により、プログラマは手動メモリ管理の負担から解放され、コア アプリケーション ロジックに集中できるようになります。 ただし、堅牢で効率的なコードを作成するには、GC の基本的な理解が依然として不可欠です。

Ⅱ. 一般的なガベージ コレクション アルゴリズムの探索

いくつかの著名なアルゴリズムがガベージ コレクションを強化します:

  • 参照カウント: このメソッドは、各オブジェクトへの参照の数を追跡します。 オブジェクトの参照カウントがゼロになり、アクティブな参照がないことを示すと、オブジェクトは再利用されます。 Python、PHP、および Swift はこのアプローチを利用します。

    • 利点: オブジェクトのリサイクルが迅速で、メモリの枯渇や特定のしきい値を待ってから動作することはありません。
    • 欠点: 循環参照に対して効果がなく、リアルタイムの参照カウントによりオーバーヘッドが追加されます。
  • マークスイープ: このアルゴリズムはルート変数から始まり、到達可能なすべてのオブジェクトをマークします。 マークされていないオブジェクトは、到達不可能と見なされ、ガベージとして収集されます。 Golang (3 色マーキング方法を使用) と Python (補助メカニズムとして) はこの技術を採用しています。

    • 利点: 参照カウントの制限を克服します。
    • 欠点: STW (Stop-The-World) が必要で、プログラムの実行を一時的に停止します。
  • 世代別コレクション: この高度なアプローチでは、オブジェクトの存続期間に基づいてメモリを世代に分割します。 存続期間の長いオブジェクトは古い世代に存在し、存続期間の短いオブジェクトは新しい世代に存在します。 世代が異なると、使用するリサイクル アルゴリズムと頻度も異なります。 Java と Python (補助メカニズムとして) はこのメソッドを利用します。

    • 利点: 優れたリサイクル性能。
    • 欠点: アルゴリズムが複雑になります。

III. Python のガベージ コレクションを理解する

Python のメモリ管理の詳細は、その実装によって異なります。 最も一般的な実装である CPython は、アクセスできないオブジェクトを検出するために参照カウントに依存しています。 ただし、循環参照を処理するための循環検出メカニズムも含まれています。 サイクル検出アルゴリズムは、これらのアクセスできないサイクルを定期的に特定して削除します。

gc モジュールは、ガベージ コレクションの制御、デバッグ統計へのアクセス、コレクター パラメーターの微調整のためのツールを提供します。 他の Python 実装 (Jython、PyPy) は、包括的なガベージ コレクターなど、異なるメカニズムを採用している場合があります。 参照カウント動作に依存すると、移植性の問題が生じる可能性があります。

  • Python での参照カウント: Python の主要な GC メカニズムは参照カウントです。 各オブジェクトは、その参照を追跡する ob_ref フィールドを維持します。 このカウントの増減は、参照の変更を反映します。 カウントが 0 の場合、オブジェクトのリサイクルが即時にトリガーされます。

    • 制限事項: 参照カウント用に追加のスペースが必要であり、循環参照に対処できないため、メモリ リークが発生する可能性があります。 次の例を考えてみましょう:
<code class="language-python">a = {}  # A's reference count is 1
b = {}  # B's reference count is 1
a['b'] = b  # B's reference count becomes 2
b['a'] = a  # A's reference count becomes 2
del a  # A's reference count is 1
del b  # B's reference count is 1</code>
ログイン後にコピー
ログイン後にコピー

Python Garbage Collection: Everything You Need to Know

<code>*   After `del a` and `del b`,  a circular reference exists.  Reference counts aren't zero, preventing automatic cleanup.</code>
ログイン後にコピー
ログイン後にコピー
  • Python のマーク スイープ: Python の補足的なマーク スイープ アルゴリズムは、トレース GC に基づいており、循環参照に対処します。これは、アクティブなオブジェクトのマーク付けと非アクティブなオブジェクトの削除の 2 つのフェーズで構成されます。ルート オブジェクトから開始して、到達可能なオブジェクトを横断し、オブジェクトをアクティブとしてマークします。その後、マークのないオブジェクトが収集されます。 文字列や数値では循環参照が作成されないため、これは主にコンテナ オブジェクト (リスト、辞書など) を処理します。 Python は二重リンク リストを利用してこれらのコンテナ オブジェクトを管理します。

    • 欠点: 非アクティブなオブジェクトがほんの一部であっても、ヒープ全体のスキャンが必要です。
  • Python の世代リサイクル: この時間と空間のトレードオフにより、オブジェクトの年齢に基づいてメモリが世代 (若年、中年、高齢者) に分割されます。 ガベージ コレクションの頻度はオブジェクトの古さとともに減少します。 新しく作成されたオブジェクトは若い世代で開始され、ガベージ コレクション サイクルを乗り越えた場合は古い世代に移動します。 これは、マークスイープに基づいて構築された補足的なメカニズムでもあります。

Python Garbage Collection: Everything You Need to Know

IV. メモリ リークへの対処

Python を日常的に使用する場合、メモリ リークはまれです。 ただし、CPython は、特定のシナリオでは終了時にすべてのメモリを解放しない場合があります:

  • グローバル名前空間またはモジュールから参照されたオブジェクトは、特に循環参照の場合、永続化される可能性があります。 C ライブラリによって割り当てられたメモリの一部も残る可能性があります。
  • Python は終了時にメモリをクリーンアップしようとしますが、これは常に完璧であるとは限りません。
  • atexit モジュールを使用すると、プログラムの終了前にクリーンアップ関数を実行できます。

コード例と改善:

<code class="language-python">a = {}  # A's reference count is 1
b = {}  # B's reference count is 1
a['b'] = b  # B's reference count becomes 2
b['a'] = a  # A's reference count becomes 2
del a  # A's reference count is 1
del b  # B's reference count is 1</code>
ログイン後にコピー
ログイン後にコピー

改善されたコード:

<code>*   After `del a` and `del b`,  a circular reference exists.  Reference counts aren't zero, preventing automatic cleanup.</code>
ログイン後にコピー
ログイン後にコピー

Leapcell: Python アプリケーションのための理想的なサーバーレス プラットフォーム

Python Garbage Collection: Everything You Need to Know

Leapcell は、Python サービスを展開するための優れたソリューションを提供します。

1.多彩な言語サポート

JavaScript、Python、Go、または Rust を使用して開発します。

2.無料かつ無制限のプロジェクト展開

実際の使用量に対してのみ支払います。アイドル料金は発生しません。

3.抜群の費用対効果

隠れた手数料なしの従量課金制。 例: 25 ドルで 694 万件のリクエスト (平均応答時間 60 ミリ秒) をサポートします。

4.合理化された開発者エクスペリエンス

ユーザーフレンドリーなインターフェイス、自動化された CI/CD、GitOps 統合、リアルタイム メトリクス、ロギング。

5.容易な拡張性と高性能

自動スケーリングは高い同時実行性を処理します。運用上のオーバーヘッドはゼロです。

Python Garbage Collection: Everything You Need to Know

ドキュメントで詳細を確認してください!

リープセル Twitter: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd

以上がPython ガベージ コレクション: 知っておくべきことすべての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート