||エラーページの内容も例外の情報の一部になっているので、Tempfileを|使っている場合には当然そうなるでしょう。||エラーページの内容は捨ててしまうか、エラーのときにはサイズに関わ|らずStringIOにするか、Tempfileなので気にしないことにするか。部分的にしか理解できていません。Tempfileなのでcloseすると情報が失われるから保存しているのは理解できました。気になるのは、今回「リーク」とされたのは、ただちにcloseされていないからプロセスが肥大しただけのことで、いずれGCで回収されるのかどうか、ということです。ないなら、それはそれで確認しないと。Tempfileは面倒だなあ。ago=begin言いだしっぺの佐々木です。ee.io.closeendGC.startの様に書けば確実にcloseされるのなら問題ないですが、そうでもないようです。GCでは未使用のメモリを回収してくれるだけで未使用のfdを回収してくれることはないのですよね。メモリに余裕がある状態だとfdをつかんだ例外オブジェクトも回収されず、fdも開きっぱなしになるのではないかとおもいます。(再現スクリプトでは1.9では開きっぱなしのfdの数が少ないです。files」になったせいでした。filesにぶつかったのでした。大きいサイズのエラーページというのもレアなのでなかなか気づきにくい問題でした。writes:部分的にしか理解できていません。Tempfileなのでcloseすると情報が失われるから保存しているのは理解できました。気になるのは、今回「リーク」とされたのは、ただちにcloseされていないからプロセスが肥大しただけのことで、いずれGCで回収されるのかどうか、ということです。され、テンポラリファイルは削除されます。Tempfileは面倒だなあ。つければいくらかは軽減できるでしょう。場合は例外の中に入れるので適用できませんが。writes:|GC.start|の様に書けば確実にcloseされるのなら問題ないですが、そうでもないようです。RubyのGCは保守的なのですべて回収されることは保証できません。|GCでは未使用のメモリを回収してくれるだけで未使用のfdを回収してくれることは|ないのですよね。|メモリに余裕がある状態だとfdをつかんだ例外オブジェクトも回収されず、|fdも開きっぱなしになるのではないかとおもいます。|(再現スクリプトでは1.9では開きっぱなしのfdの数が少ないです。GCが効いている?)GCは参照されていないオブジェクトを回収します。そのオブジェクトがfdを持てば、それは自動的にcloseします。files」になったせいでした。filesにぶつかったのでした。RubyはEMFILEが発生すると自動的にGCを起動します。それでもなおEMFILEが出ると言うことは、また別の問題を示唆しますね。ago=begin佐々木です。ありがとうございます。下記スクリプトを実行すると1.8(ちょっと古いのですが)では251回目でErrno::EMFILEとなってしまいました。例外オブジェクトが持つioがcloseされないようです。1.9では2000回まで行きました。writes:|GC.start|の様に書けば確実にcloseされるのなら問題ないですが、そうでもないようです。RubyのGCは保守的なのですべて回収されることは保証できません。|GCでは未使用のメモリを回収してくれるだけで未使用のfdを回収してくれることは|ないのですよね。|メモリに余裕がある状態だとfdをつかんだ例外オブジェクトも回収されず、|fdも開きっぱなしになるのではないかとおもいます。|(再現スクリプトでは1.9では開きっぱなしのfdの数が少ないです。GCが効いている?)GCは参照されていないオブジェクトを回収します。そのオブジェクトがfdを持てば、それは自動的にcloseします。files」になったせいでした。filesにぶつかったのでした。RubyはEMFILEが発生すると自動的にGCを起動します。それでもなおEMFILEが出ると言うことは、また別の問題を示唆しますね。writes:|縮めるとこんな感じでしょうか。すると回収されるようになるのが非常|に怪しいです。うーん、マシンスタックに例外オブジェクトへの参照が残ってしまってるのかもしれませんね。この辺が保守的GCの弱いところです。MBARIパッチで挙動が変わったりするんでしょうか。writes:うーん、マシンスタックに例外オブジェクトへの参照が残ってしまってるのかもしれませんね。この辺が保守的GCの弱いところです。保守的GCは便利ないいわけですが、たぶん違います。オブジェクトの中から例外オブジェクトが参照されている感じですが、どういう理屈でそうなるのかはよくわかりません。LangLoading...。