まつもと ゆきひろです

In message "Re: [ruby-dev:39302] Re: [Bug #2067] bodyが大きいエラーページをopen-uriで取得するとfdがリークしている"
    on Fri, 11 Sep 2009 01:34:01 +0900, takeru sasaki <sasaki.takeru / gmail.com> writes:

|GC.start
|の様に書けば確実にcloseされるのなら問題ないですが、そうでもないようです。

RubyのGCは保守的なのですべて回収されることは保証できません。

|GCでは未使用のメモリを回収してくれるだけで未使用のfdを回収してくれることは
|ないのですよね。
|メモリに余裕がある状態だとfdをつかんだ例外オブジェクトも回収されず、
|fdも開きっぱなしになるのではないかとおもいます。
|(再現スクリプトでは1.9では開きっぱなしのfdの数が少ないです。GCが効いている?)

GCは参照されていないオブジェクトを回収します。そのオブジェク
トがfdを持てば、それは自動的にcloseします。

|この問題に気がついたのは、「EMFILE too many open files」になったせいでした。
|例外オブジェクトへの参照は確実に無いはずで(メソッドからreturnしている)
|gcされるより前にtoo many open filesにぶつかったのでした。

RubyはEMFILEが発生すると自動的にGCを起動します。それでもなお
EMFILEが出ると言うことは、また別の問題を示唆しますね。