Hatena::Grouppython

三歩歩くと忘れる人のメモ

2009-04-14

pythonのガーベジコレクタ

12:11

最近、メモリを怪獣のように食べまくるプログラムばかり書いているので、pythonのガーベジコレクタがどのような仕組みで動いているのか調べてみた。

ネットの情報をさらってみた感じでは、pythonのガーベジコレクタは2つの仕組みで動いているとのこと。

・参照カウンタ方式

・マークアンドスィープ方式


参照カウンタ方式は参照されている箇所を数えておいて、0になったら解放する。

マークアンドスィープ方式は全てのオブジェクトを走査して参照があるオブジェクトにマークを付けていく。全てのオブジェクトを走査した結果、マークが付いていないオブジェクトを解放する。

マークアンドスィープ方式は定期的に動くモノであるが、ほとんどの変数オブジェクトは参照カウンタ方式により解放されてしまうので、Java.NET Frameworkのように定期的にガーベジコレクタが動作して不要になった領域を開放するわけではないと言うことか。


試しに以下のプログラムを書いてメモリ使用量をタスクマネージャで眺めてみた。

# coding: cp932

for i in range(1, 1000000):
	a = []
	for j in range(1, 1000000):
		a.append(j)

メモリの値が70,000KB~80,000KBの間を行ったり来たりしている。どうやら参照カウンタ方式がちゃんと動作しているようだ。


最近書いたコードはメモリ解放が正しくおこなわれているか気になるからdelで解放していたが不要っぽい。

というか、delを誤解してた。delは未定義にするだけで解放するわけではないとのこと。

http://python.g.hatena.ne.jp/muscovyduck/20080721/p1

(未定義にされることにより参照カウンタが-1されて0になる場合は解放されるが)


しばらくdelを封印して様子を見てみる。

ゲスト



トラックバック - http://python.g.hatena.ne.jp/Nekomajin/20090414