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

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

なお毎日 Amazon の書影を貼っていたんですが、「この商品を含むブログを見る」のページを占拠してしまっていてちょっとノイズっぽいので、本書は各章の最初など節目で貼るようにします。

引き続き Python のメモリアロケーション部分です。

  • プール内のブロックは割り当て中、使用済み、未使用に分けて管理。使用済みはフリーリスト管理。最初に未使用のものをフリーリストにするコストを省いてる
  • PyObject_Malloc() - オブジェクトのメモリ割り当て関数
    • 一旦使用済みになったプールは再割り当て時にはまたブロックサイズが初期化される場合がある
  • PyObject_Free() - オブジェクトの解放関数
    • わりと素直に未使用になった arena はすぐ解放している
    • 使用率の多いアリーナを優先的に再割り当てに使うなどオブジェクトがばらけずにメモリの解放が起きやすくなるような工夫がされている
  • 第3層 オブジェクト特有アロケータ
    • 型ごとに特有のアロケータがあるんですね! よく使う組み込み型のオブジェクトは第2層の低レベルメモリ管理まで行かないように一定数は確保しまま使いまわすなど。
  • 参照カウントGCの処理系はやっぱり大変そう
    • ファイナライザ - ファイナライズの処理中に参照が変化したら?と思ったらそれは解放されないようにしているらしい。ということはその参照が切れた時にまたファイナライザが呼ばれてしまう?消せないオブジェクトが作れそうですね