参照カウントDELゴミ回収と循環参照

1281 ワード

Pythonのゴミ回収アルゴリズムは を採用しており、1つのオブジェクトの参照カウントが0の場合、Pythonのゴミ回収メカニズムはオブジェクトを回収する
コピー
参照数
  • Pythonは参照カウントを使用してメモリ内のオブジェクトを追跡し、オブジェクトの参照カウントが0になるとゴミ回収
  • になる.
  • オブジェクトが初めて作成され、変数に割り当てられると、そのオブジェクトの参照カウントは1
  • となる.
  • オブジェクトの参照が他の変数に割り当てられるたびに、オブジェクトの参照カウントは自動的に1
  • 加算.
  • オブジェクトの1つの参照が破棄されると、参照カウントは自動的に1
  • 減少する.
    del文
  • del文は、オブジェクトの参照
  • を削除します.
  • これにより、参照が指すオブジェクトの参照カウントが1
  • 減少する.
  • 注意:追跡またはデバッガは、オブジェクトに追加の参照を追加し、オブジェクトが回収される時間を遅らせることに注意してください.

  • ごみ回収
  • ゴミ回収器は、参照カウントが0のオブジェクトを探すための独立したコードです.
  • ゴミ回収機も、特定の状況で循環参照が発生するため、参照カウントが0より大きいが破棄されるべきオブジェクトを検査する責任を負う.
  • ループ参照は、2つのオブジェクトが互いに参照されている間に、すべての参照が消え、これらの参照は依然として存在します.次に、ループ参照の例を示します.
  • import objgraph  #           
    
    if __name__ == '__main__':
        a = list()
        b = list()
        #   list       
        # output: n
        print(objgraph.count('list'))
        a.append(b)
        b.append(a)  #     
    
        print(a)
        print(b)
        del a
        del b
        #     list       
        # output: n
        print(objgraph.count('list'))
    
    の出力は、aおよびbの参照が削除された後もlistタイプのオブジェクトの数は変わらず、a,bがループ参照を生成したことを示す.
    205
    [[[...]]]
    [[[...]]]
    205
    
    ループ参照をもたらす文を注釈して再実行します.出力は以下の通りです.
    205
    [[]]
    []
    203