From: Yukihiro Matsumoto Date: 2009-09-11T07:46:17+09:00 Subject: [ruby-dev:39307] Re: [Bug #2067] bodyが大きいエラーページをopen-uriで取得するとfdがリークしている まつもと ゆきひろです In message "Re: [ruby-dev:39302] Re: [Bug #2067] bodyが大きいエラーページをopen-uriで取得するとfdがリークしている" on Fri, 11 Sep 2009 01:34:01 +0900, takeru sasaki 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が出ると言うことは、また別の問題を示唆しますね。