[#47135] [ruby-trunk - Feature #8024][Assigned] Lazy sweep を on/off するための機能 — "mrkn (Kenta Murata)" <muraken@...>
16 messages
2013/03/06
[#47150] [ruby-trunk - Bug #8054][Open] open-uri と resolv-replace を同時にロードすると壊れる — "mrkn (Kenta Murata)" <muraken@...>
4 messages
2013/03/09
[#47157] 1CPUでtest-allするとfiberとFileUtilsでエラーたくさん — KOSAKI Motohiro <kosaki.motohiro@...>
CentOS6.3上で
3 messages
2013/03/10
[ruby-dev:47197] Re: [ruby-dev:47194] [ruby-trunk - Feature #8024] Lazy sweep を on/off するための機能
From:
SASADA Koichi <ko1@...>
Date:
2013-03-24 15:20:06 UTC
List:
ruby-dev #47197
(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