(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