From: "tmm1 (Aman Gupta)" Date: 2013-03-14T18:46:13+09:00 Subject: [ruby-core:53405] [ruby-trunk - Bug #8095][Open] [patch] gc: fix unlimited memory growth with large values of RUBY_FREE_MIN Issue #8095 has been reported by tmm1 (Aman Gupta). ---------------------------------------- Bug #8095: [patch] gc: fix unlimited memory growth with large values of RUBY_FREE_MIN https://bugs.ruby-lang.org/issues/8095 Author: tmm1 (Aman Gupta) Status: Open Priority: Normal Assignee: authorNari (Narihiro Nakamura) Category: core Target version: ruby -v: ruby 2.1.0dev (2013-03-14 trunk 39748) [x86_64-darwin12.2.1] Normally, do_heap_free is set to 65% of total slots available. But if you specify a very large RUBY_FREE_MIN, then do_heap_free is always set to 100%. This results in a memory leak over time. Instead of forcing do_heap_free = 100%, the following patch sets do_heap_free = max( RUBY_FREE_MIN, 65% ) diff --git a/gc.c b/gc.c index bd95073..4103af6 100644 --- a/gc.c +++ b/gc.c @@ -1973,8 +1973,9 @@ before_gc_sweep(rb_objspace_t *objspace) objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65); objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.2); if (objspace->heap.free_min < initial_free_min) { - objspace->heap.do_heap_free = heaps_used * HEAP_OBJ_LIMIT; objspace->heap.free_min = initial_free_min; + if (objspace->heap.do_heap_free < initial_free_min) + objspace->heap.do_heap_free = initial_free_min; } objspace->heap.sweep_slots = heaps; objspace->heap.free_num = 0; -- http://bugs.ruby-lang.org/