pyてよn日記

一寸先は闇が人生

Python:ガベージコレクションが行われるタイミング

Python では,言語処理系(CPython)の機能として実装されている「ガベージコレクション」(以下,GC)によって,不要になったメモリ領域を自動的に解放している.GC の機能が無い言語の場合,手動でやらなければならないが,Python には GC の機能がついているため,使用者がこれを意識する必要はあまりない.

本記事では,Python の処理系が GC を行うタイミングをざっくりまとめた.

pythonGC が行われるタイミング

Python のプログラムが動作している最中で,GC が行われるタイミングを挙げてみる.主に以下の 3 つ.

  • オブジェクトの参照を切る
  • 変数を del 文で消去し,「最後の」参照を切る
  • 標準モジュール gc を用いて手動で GC を行う

オブジェクトの参照を切る

  • 参照を切る
a = 'fuga'
a = 'piyo'  # ここで 'fuga' の参照が切れ,メモリが解放される

変数を del 文で消去し,「最後の」参照を切る

del 文で参照が切れる場合と切れない場合の例を見る.

  • del 文で参照が切れる場合

以下のコードでは,変数 a が消去されたタイミングで 'fuga' への参照が切れるため,'fuga' に使用されているメモリは解放される.

a = 'fuga'
del a
  • del 文で参照が切れない場合

以下のコードでは,変数 a が消去されたタイミングでも,'fuga' は変数 b から参照されており,参照は完全には切れていない.

a = 'fuga'
b = a
del a  # まだ b による 'fuga' への参照が残っている

上記のコードに del b を足すと,'fuga' への参照が完全に切れ,'fuga'(str 型オブジェクト)に使用されていたメモリは解放される.

a = 'fuga'
b = a
del a  # まだ b による 'fuga' への参照が残っている
del b  # 'fuga' への参照が完全に切れ,'fuga' のメモリが解放される

標準モジュール gc を用いて手動で GC を行う

import gc

a = 'fuga'
del a
gc.collect()  # 即時 GC が行われる

詳細は以下のドキュメントを参照.

docs.python.org

終わりに

「いつか gc モジュールを使って GC 周りを弄ってみたい」という気持ちを忘れない内にメモとしてこの記事を残した.