ガベージコレクションのアルゴリズムと実装 第9章「Python の GC」その3

今日は第9章「PythonGC」の3日目です。

参照の所有権と循環参照の部分です。

  • 参照の所有権って何のことだろうかと思ったら、戻り値は呼び出し元のぶんの参照を先にインクリメントしてから関数から抜けるとか、引数の参照をインクリメントせずに渡す(一時的な利用しかしない)とかそういうテクニックを理解するために導入した概念ということか……
    • 参照カウントによるメモリ管理を作ったことがあれば、こういうのはよくあることなので、「所有権」という語彙を導入しなくても粛々と「ほら、これで大丈夫」とコードを説明されたほうがすんなり読めた気がします。
    • Pythonソースコードにそういう説明があったのかもしれませんね
  • 循環参照したオブジェクトのGC
    • コンテナオブジェクト(参照を持ち得るオブジェクト)のみ循環参照GC用のヘッダを持つとか
    • コンテナオブジェクトは双方向循環リストで別途管理されていてそこで参照数を流用したマークスイープGC
    • コンテナオブジェクトリストは世代別になってるとか
    • よく「Python では参照カウントを使っていて、循環参照は時々マークスイープGCをして解放している」という一般論は目にしますが、実際に何をやっているかをみると単にマークスイープGCというだけではなくて参照カウントベースにしているからこその工夫があったりして、GCアルゴリズムだけではなくて具体的な実装がおもしろいですね