In article <87veqbfwbv.fsf / fsij.org>, Tanaka Akira <akr / fsij.org> writes: >> まだプロファイルは取ってみていないのですが,この結果を見る限りでは,GC >> アルゴリズムそのものの問題というよりは,GC開始のスレッショルドや,アロ >> ケーション方法などの問題と考えた方が妥当なのでしょうか? >> また,このような結果になることはよく知られた事実なのでしょうか? > > GC をどういうタイミングで起動するか、あるいは、そもそも GC > をするか OS にメモリを要求してヒープを広げるか、という判断が > あまりうまくいかないことがある、というのは確かだと思います。 GC 後にどのくらい空いてればヒープを広げるか、という基準をい じくると改善できるようですね。 4096個空いてれば、というのを、2割空いてれば、とすると、こう でしょうか。 (現在の) GC はヒープのサイズに比例したコストがかかるので、定 数しか空かないならわりに合わないってことでしょうね。 この問題に対して、世代別 GC が正しい解かというと、さて、どう かな。 Index: gc.c =================================================================== RCS file: /src/ruby/gc.c,v retrieving revision 1.241 diff -u -r1.241 gc.c --- gc.c 29 Jun 2006 14:57:41 -0000 1.241 +++ gc.c 6 Jul 2006 14:14:55 -0000 @@ -1057,6 +1057,14 @@ int freed = 0; int i; unsigned long live = 0; + unsigned long free_min = 0; + + for (i = 0; i < heaps_used; i++) { + free_min += heaps[i].limit; + } + free_min = free_min * 0.2; + if (free_min < FREE_MIN) + free_min = FREE_MIN; mark_source_filename(ruby_sourcefile); if (source_filenames) { @@ -1099,7 +1107,7 @@ } p++; } - if (n == heaps[i].limit && freed > FREE_MIN) { + if (n == heaps[i].limit && freed > free_min) { RVALUE *pp; heaps[i].limit = 0; @@ -1117,7 +1125,7 @@ if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT; } malloc_increase = 0; - if (freed < FREE_MIN) { + if (freed < free_min) { add_heap(); } during_gc = 0; -- [田中 哲][たなか あきら][Tanaka Akira]