ガベージコレクション で パイソン は、メモリの割り当てと割り当て解除を処理し、メモリを効率的に使用できるようにする自動プロセスです。などの言語とは異なり、 C または C++ プログラマは手動でメモリの割り当てと割り当て解除を行う必要があります。Python は、次の 2 つの主要な戦略を通じてメモリを自動的に管理します。
- 参照カウント
- ガベージコレクション
参照カウント
Pythonは使用します 参照カウント メモリを管理するため。各オブジェクトは、それを指す参照の数を追跡します。参照カウントがゼロになると、つまり参照が残らなくなると、Python は自動的にオブジェクトの割り当てを解除します。 例:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
出力
2 3 2
説明:
- × 最初に 2 回参照されます (x によって 1 回、getrefcount() によって 1 回)。
- 割り当てる y = x カウントが増えます。
- 設定 y = なし 参照を 1 つ削除します。
参照カウントの問題
循環参照、つまり循環内で相互に参照するオブジェクトが存在すると、参照カウントは失敗します。たとえ他にそれらを指すものがないとしても、それらの参照カウントは決してゼロにはなりません。 例:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
出力
3 3
説明:
- × 含まれています そして そして そして 含まれています × 。
- 削除した後でも × そして そして Python は参照カウントを使用するだけではメモリを解放できません。これは、それぞれがまだ他方を参照しているためです。
循環参照のガベージ コレクション
ガベージコレクション は、アクセスできなくなったメモリ、またはアプリケーションによって使用されなくなったメモリを自動的に再利用するためにプログラミング言語で使用されるメモリ管理手法です。このような循環参照を処理するために、Python は ガベージコレクター (GC) 組み込み gc モジュールから。このコレクターは、参照サイクルに関係するオブジェクトを検出してクリーンアップできます。
世代別ガベージ コレクション
Python の世代別ガベージ コレクターは、循環参照を処理するように設計されています。オブジェクトは、その寿命に基づいて 3 つの世代に分類されます。
- 世代 0: 新しく作成されたオブジェクト。
- 世代 1: 1 回の収集サイクルを超えて生き残ったオブジェクト。
- 世代 2: 長命オブジェクト。
参照サイクルが発生すると、ガベージ コレクターが自動的にそれを検出してクリーンアップし、メモリを解放します。
サイクルの自動ガベージ コレクション
ガベージ コレクションは、割り当ての数が割り当て解除の数を特定のしきい値によって超えると、自動的に実行されます。このしきい値は、gc モジュールを使用して検査できます。
Pythonimport gc print(gc.get_threshold())
出力
(2000 10 10)
説明: 世代 0、1、および 2 のしきい値タプルを返します。割り当てが超過すると、しきい値の収集がトリガーされます。
手動ガベージコレクション
特に参照サイクルの場合、ガベージ コレクターを手動で呼び出すことが有益な場合があります。 例:
Pythonimport gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c)
出力
0 10
説明:
- デフファン(i) 辞書参照自体を作成することで循環参照を作成します。
- gc.collect() ガベージ コレクションをトリガーし、収集されたオブジェクトの数 (最初は 0) を保存します。
- 範囲内の i の場合(10) 電話 楽しい(i) 10 個の循環参照を 10 回作成します。
- gc.collect() ガベージ コレクションを再度トリガーし、収集されたサイクル数を出力します。
手動ガベージコレクションの種類
- 時間ベースのガベージ コレクション: ガベージ コレクターは一定の時間間隔でトリガーされます。
- イベントベースのガベージコレクション: ガベージ コレクターは、ユーザーがアプリケーションを終了したときやアプリケーションがアイドル状態になったときなど、特定のイベントに応答して呼び出されます。
強制ガベージコレクション
Python のガベージ コレクター (GC) は、未使用のオブジェクトをクリーンアップするために自動的に実行されます。手動で強制するには、gc モジュールの gc.collect() を使用します。 例:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
説明:
- a b cから への参照を削除します ab そして c ガベージ コレクションの対象となるようにします。
- gc.collect() ガベージ コレクションで参照されていないオブジェクトをクリーンアップしてメモリを解放します。
ガベージコレクションの無効化
Python では、ガベージ コレクターが自動的に実行され、参照されていないオブジェクトがクリーンアップされます。実行されないようにするには、gc モジュールの gc.disable() を使用して無効にします。 例:
Pythonimport gc gc.disable() gc.enable()
説明:
- gc.disable() 自動ガベージコレクションを無効にします。
- gc.enable() 自動ガベージ コレクションを再度有効にします。
Python ガベージ コレクターとの対話
Python ガベージ コレクターと呼ばれる組み込みメカニズムは、メモリを解放してメモリ リークを防ぐために、参照されなくなったオブジェクトを自動的に削除します。 Python gc モジュールは、多くの場合自動的に実行されるガベージ コレクターと対話するためのさまざまな方法を提供します。
1. ガベージ コレクターの有効化と無効化: ガベージ コレクターを有効または無効にするには、 GC。有効にする() そして GC。無効にする() それぞれ機能します。 例 :
JavaのタイプPython
import gc # Disable gc.disable() # Enable gc.enable()
2. ガベージコレクションの強制: ガベージ コレクションを手動でトリガーするには、 GC。集める() 関数。これは、自動ガベージ コレクションが発生するのを待つのではなく、即時にガベージ コレクションを強制したい場合に便利です。 例:
Pythonimport gc gc.collect()
3. ガベージ コレクターの設定を検査します。 ガベージ コレクターの現在の設定を調べるには、 gc.get_threshold() 世代 0、1、および 2 の現在のしきい値を表すタプルを返す関数。 例:
Pythonimport gc t = gc.get_threshold() print(t)
出力
(2000 10 10)
4. ガベージ コレクターのしきい値を設定します。 ガベージ コレクションのしきい値は、 gc.set_threshold() 関数。これにより、ガベージ コレクションの頻度に影響を与えるさまざまな世代のしきい値を手動で調整できます。 例:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
出力
(500 5 5)
メリットとデメリット
Python のガベージ コレクションの長所と短所をいくつか見てみましょう。
利点 | 短所 |
|---|---|
自動メモリ管理 | パフォーマンスのオーバーヘッドが発生する可能性がある |
手動によるメモリ処理は不要 | メモリの概念を理解する必要がある |
世代を経た効率的なクリーンアップ | GC のタイミングの制御が制限されている |
カスタマイズ可能な GC 設定 | バグまたはメモリリークの可能性 |