Python_Garbage Collectionによるメモリ開放 #378
PythonのGarbage Collectionについて学んだのでメモしておきます。
Gabage Collectionとは
Garbage Collection自体はPythonに限らない一般的なメモリ管理システムで、プログラムの実行中に使用されなくなったメモリを自動的に見つけ出し、開放して再利用できるようにするためのものです。
Garbage Collectionの登場以前はプログラマ自身がメモリ確保と開放のコードを都度書く必要があり、メモリリークの温床となっていたみたいです。メモリリークとは使用可能なメモリを食い潰してしまい、プログラムが動作不能になることで、メモリ開放が漏れていると発生しやすくなります。
現在は、PythonやJavaのように言語処理系に組み込まれていてほとんど意識しなくていい言語もあれば、C言語のように言語処理系には存在せず、ライブラリを使用してプログラマが実装しなくてはならない言語があります。
PythonのGarbage Collectionの特徴
PythonのGCは主に参照カウントというメカニズムと、循環参照を検出するためのGCモジュールの二つのメカニズムによって機能します。またはこの2つに頼らず強制実行する方法もあります。
参照カウント
Pythonでは、オブジェクトへの参照があるたびに参照カウントが増加します。一方、オブジェクトへの参照が削除される(例えば、そのオブジェクトを指していた変数が削除される)と参照カウントが減少します。
この特性を活かし、参照カウントがゼロになると、そのオブジェクトはメモリから解放するというメカニズムです。これは即時のメモリ解放を可能にします。
ただしこれは循環参照(オブジェクトが直接または間接的に自分自身を参照する状況)ではうまく働かないので、後続のGCモジュールがあります。
GCモジュール
循環参照は参照カウントだけでは検出できないため、Pythonは追加でGCモジュールを利用します。このモジュールは定期的にメモリをスキャンし、循環参照を検出して解放します。ただし、このプロセスは比較的コストが高いため頻繁には行われません。
強制実行
PythonのGCはgcモジュールを通じて一部制御することも可能です。例えば、gc.collect()を呼び出すと手動でガベージコレクションを強制的に実行させることができます。
参照カウントやGCモジュールのメカニズムはとても有用で便利ですが、思い通りのタイミングで実行されるよう制御できるわけではありません。特にオブジェクトが大量に生成・消費される高負荷なデータ処理が動いている時など、瞬間的なメモリ不足により処理の一部がFailしてしまうこともあると思います。
そんな時はgc.collect()でGarbage Collectionを強制実行したり、メモリ消費の大きい変数を明示的に削除したり、必要なメモリを確保するための工夫が必要になってきます。
ここまでお読みいただきありがとうございました!