From: ko1@... Date: 2014-03-29T04:37:19+00:00 Subject: [ruby-dev:48075] [ruby-trunk - Bug #9687] [Closed] Make a cap for malloc_limit adjustment Issue #9687 has been updated by Koichi Sasada. Status changed from Open to Closed % Done changed from 0 to 100 Applied in changeset r45468. ---------- * gc.c (gc_before_sweep): cap `malloc_limit' to gc_params.malloc_limit_max. It can grow and grow with such case: `loop{"a" * (1024 ** 2)}' [Bug #9687] This issue is pointed by Tim Robertson. http://www.omniref.com/blog/blog/2014/03/27/ruby-garbage-collection-still-not-ready-for-production/ ---------------------------------------- Bug #9687: Make a cap for malloc_limit adjustment https://bugs.ruby-lang.org/issues/9687#change-45987 * Author: Koichi Sasada * Status: Closed * Priority: Normal * Assignee: Koichi Sasada * Category: core * Target version: current: 2.2.0 * ruby -v: 2.2 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- The blog post [Ruby Garbage Collection: Still Not Ready for Production] (http://www.omniref.com/blog/blog/2014/03/27/ruby-garbage-collection-still-not-ready-for-production/) pointed out that the following code consumes all of memory: ```ruby while true "a" * (1024 ** 2) end ``` This is because `malloc_limit' grows and grows infinitely. The following patch will solve this issue. ``` Index: gc.c =================================================================== --- gc.c (revision 45433) +++ gc.c (working copy) @@ -2890,7 +2890,7 @@ gc_before_sweep(rb_objspace_t *objspace) malloc_limit = (size_t)(inc * gc_params.malloc_limit_growth_factor); if (gc_params.malloc_limit_max > 0 && /* ignore max-check if 0 */ malloc_limit > gc_params.malloc_limit_max) { - malloc_limit = inc; + malloc_limit = gc_params.malloc_limit_max; } } else { ``` Maybe this patch should be applied for 2.1.x series. -- https://bugs.ruby-lang.org/