From: Urabe Shyouhei Date: 2009-09-11T18:14:22+09:00 Subject: [ruby-dev:39315] Re: [Bug #2067] bodyが大きいエラーページをopen-uriで取得するとfdがリークしている Tanaka Akira さんは書きました: > In article , > Yukihiro Matsumoto writes: > >> うーん、マシンスタックに例外オブジェクトへの参照が残ってしまっ >> てるのかもしれませんね。この辺が保守的GCの弱いところです。 > > 保守的GCは便利ないいわけですが、たぶん違います。 > > callback で生成した Proc オブジェクトの中から例外オブジェク > トが参照されている感じですが、どういう理屈でそうなるのかはよ > くわかりません。 tmpfile使わない版だとこんな感じ? zsh % ~/target/svn/ruby_1_8/bin/ruby class Err < StandardError def initialize obj @io = obj end end def cb proc {} end def tmperr tmpf = [open("/dev/null")] ObjectSpace.define_finalizer tmpf, cb raise Err.new(tmpf) end loop do begin tmperr(){} rescue Err => e end end ^D -:12:in `initialize': Too many open files - /dev/null (Errno::EMFILE) from -:12:in `open' from -:12:in `tmperr' from -:19 from -:17:in `loop' from -:17 zsh: exit 1 ~/target/svn/ruby_1_8/bin/ruby