Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

メモリの開放タイミング

python実メモリがいつ解放されるのか気になったので調べてみた。

pythonはメモリを確保する際にドバっと取って使い回すような仕組みを持っている。
(最近の言語はみんなそうかも)
この領域をarenaと呼ぶ。

余談だけど2.5以前(2.5の初期も入るのかな?)のバージョンではarena領域は小さくなることはない。
(Timのパッチからスタート。使いまわしはあってもfreeされることはなかった)

タイミング的な話なのでもう結論書いちゃうと

  1. PyObject_Mallocで作って
  2. PyObject_Freeで解放

とまあ普通だった。

使われてないpoolのblockとかはpython objectが解放される毎に解放しているようだ。
なので参照カウントを下げ、PyObject_Freeで解放された時点で全体のメモリも小さくなる。
基本的な確保するblockの単位が256Kなので大きいobjectを使ってもほぼ回収される。

pythonのメモリ管理は何層かに分かれていてたりするんだけどそーいうのはまた今度。
(poolとか??みたいな感じだし)

興味のあるひとはObjects/obmalloc.cを読むといいよ。
(他にもcompileとかASTを作る時にもPyArenaって奴作ってたりするけどね)

ブコメに出てたので追記
一度に256Byte以上allocしようとした場合はmallocをそのまま呼ぶ。
なので単体で大きい場合は即時使用メモリ小さくなる。
小さいobjectを積みあげて大きくなるケース(list)とかだとarena行きという感じかなあ。