2014年12月28日日曜日

[Perl] 相互参照するデータ構造(循環参照)のメモリリークを解決する方法

Perlは他のスクリプト言語と同じく、通常はメモリの管理をプログラムが行う必要はありません(というか、そんな必要があったらスクリプト言語を使う意義が激減する)。オブジェクト(変数や定数等)に割り当てたメモリはPerlがよしなに解放してくれます。ただ、Perlのメモリは参照カウント方式で管理されていて、 当該オブジェクトがどこからも参照されなくなった時にメモリを解放するというGC(ガーベッジコレクション)なので、お互いを参照しあう循環参照を作ると、それは(プログラム終了まで)永遠に解放されないメモリリークとなる問題があります。

循環参照の例は次の通り。


こうした循環参照で発生するメモリリークを解決するにはオブジェクトのデストラクタ(DESTROY)を使います。

ちなみに、メモリリークが発生するかどうかの調査にはDan Kogaiさん開発のData::Decycleが便利です。

参考:
 ・Perlのガーベッジコレクション(GC)の特性について - サンプルコードによるPerl入門 ~ 安定と信頼のPerlを学ぼう ~
 ・404 Blog Not Found:基本はDESTROY()
 ・404 Blog Not Found:perl - Data::Decycle で悪循環を断とう!

0 件のコメント:

コメントを投稿