Pythonメモリ管理

1345 ワード

原文リンク:Pythonメモリ管理メカニズム及び最適化の概要
Pythonには2つのメモリ管理メカニズムが共存しています.
  • 参照数:オブジェクトの参照が0の場合、オブジェクトは削除されます(ただし、ループ参照は処理できません)
  • .
  • ごみ回収:
  • Pythonでは、他のオブジェクトを参照できるすべてのオブジェクトをコンテナ(container)と呼ぶ.従って、循環参照は容器間のみで形成することができる.Pythonのゴミ回収メカニズムはこの特徴を利用して解放される対象を探している.すべてのコンテナオブジェクトを記録するために、Pythonは各コンテナを双方向チェーンテーブルにチェーンする.双方向チェーンテーブルを使用するのは、コンテナセットにオブジェクトを迅速に挿入および削除するためである.すべてのコンテナオブジェクトを維持する双方向チェーンテーブルがあれば、Pythonはゴミ回収時に次の手順で解放するオブジェクトを探します.
  • は、容器オブジェクト毎にgc_refsの値を設定、そのオブジェクトの参照カウント値に初期化する.
  • 各コンテナオブジェクトについて、参照対象オブジェクトのgc_refsの値を1だけ減少するすべての参照対象オブジェクトが見つかる.
  • のステップ2の実行後、gc_refsの値が0より大きいオブジェクトはすべて非容器オブジェクトによって参照され、少なくとも1つの非循環参照が存在する.そのため、これらのオブジェクトを解放する、別の集合に入れることはできない.
  • は、ステップ3で解放することができないオブジェクトである、あるオブジェクトを参照している場合には、参照されたオブジェクトも解放することができないので、これらのオブジェクトも別のセットに入れる.
  • このときの残りのオブジェクトはいずれも到達できないオブジェクトである.これらのオブジェクトを解放することができます.

  • Pythonオブジェクトが__del__この方法では、Pythonのゴミ回収メカニズムは、その対象が到着できないことを発見しても彼を解放しない.理由は__del__この方式は、Pythonオブジェクトの参照カウントが0で削除される前にクリーンアップ作業のために呼び出す.ごみ回収で見つかった解放が必要なオブジェクトには循環参照が存在することが多いため、循環参照のオブジェクトaとbについて、どのオブジェクトの__del__は決定できないため、Pythonのゴミ回収メカニズムはこれらのオブジェクトを解放することを放棄し、これらのオブジェクトを保存し、gcを通過する.garbageという変数にアクセスします.プログラマーはgc.garbage手動でオブジェクトを解放しますが、コードで定義しないほうがいいです.__del__という方法です