From: SASADA Koichi Date: 2013-03-25T00:20:06+09:00 Subject: [ruby-dev:47197] Re: [ruby-dev:47194] [ruby-trunk - Feature #8024] Lazy sweep を on/off するための機能 (2013/03/24 12:35), authorNari (Narihiro Nakamura) wrote: >> > すみません、ちょっとわかってないんですが、 >> > ObjectSpace.each_object 中って lazy GC 起きないようになってますよね。 >> > >> > (1) lazy sweep を止めるときは、別スレッドで適当に >> > ObjectSpace.each_object を実行しておく >> > (で、その中で sleep させておく)、というので行けると思ったんですが、 >> > あってますか? >> > > すみませんが、修正内容がよく理解できませんでした。 > 別スレッドで実行すると何が解決するのでしょうか? 修正内容云々、という話ではなく、 (1-1) lazy sweep を切るには、ObjectSpace.each_object を実行中は lazy sweep は無効になる (1-2) 例えば、 Thread.new{ObjectSpace.each_object{sleep} # sleep で止まる ... 他の処理 ...  とすると、「他の処理」実行中は lazy sweep 止まっている (1-3) 新しいメソッドなどを定義しなくても、Lazy sweep を無効にする ことができる という話を確認したかったのです。もしかしたら、私が何かしら勘違いしている かもしれないので。つまり、この ticket は簡単に実現できるんじゃないの、 と。もちろん、実装依存の bad know-how ですが、そもそも今回の用途は実装依 存の挙動に対する調査なので、まぁいいかなと。 > >> > (2) で、ヒープの拡張がうまくいかない問題は、ObjectSpace.each_object 中に >> > も同様に発生するでしょうか? もしそうなら、それはそれで修正しないといけ >> > ないような気がします。 >> > > はい、修正が必要だと思います(のでなおしておきます)。 > ただ、ObjectSpace.each_objectの中でヒープが拡張していくようなコードは無限ループになる可能性があるので、そもそもあまり推奨されるコードじゃないですね…。 each_object の実行が止まらない可能性、ですよね。それは同意できますが、そ の辺を回避するのは無理なんじゃないかなぁ。 で、この修正を入れないと、現状では (1) の「簡単に止められるんじゃない の」というのは、「実はこういう制約が入る」、ということですかね。 -- // SASADA Koichi at atdot dot net