From fff2d6d55d1cbceac4be2b6f837710dbb7eeb42e Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 15 May 2014 09:54:49 +0000 Subject: [PATCH 1/2] * gc.c (heap_extend_pages): calculate next growing heap size. * gc.c (heap_set_increment): accept addition pages instead of minimum pages. * gc.c (gc_after_sweep): use heap_etend_pages(). * gc.c (gc_heap_prepare_minimum_pages): add only 1 page. * gc.c (heap_ready_to_gc): add only 1 page. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e Conflicts: ChangeLog --- gc.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/gc.c b/gc.c index 62a49a55b39168..53361740908f76 100644 --- a/gc.c +++ b/gc.c @@ -1193,26 +1193,30 @@ heap_add_pages(rb_objspace_t *objspace, rb_heap_t *heap, size_t add) heap_pages_increment = 0; } -static void -heap_set_increment(rb_objspace_t *objspace, size_t minimum_limit) +static size_t +heap_extend_pages(rb_objspace_t *objspace) { size_t used = heap_pages_used - heap_tomb->page_length; size_t next_used_limit = (size_t)(used * gc_params.growth_factor); + if (gc_params.growth_max_slots > 0) { size_t max_used_limit = (size_t)(used + gc_params.growth_max_slots/HEAP_OBJ_LIMIT); if (next_used_limit > max_used_limit) next_used_limit = max_used_limit; } - if (next_used_limit == heap_pages_used) next_used_limit++; - if (next_used_limit < minimum_limit) { - next_used_limit = minimum_limit; + return next_used_limit - used; } +static void +heap_set_increment(rb_objspace_t *objspace, size_t additional_pages) +{ + size_t used = heap_eden->page_length; + size_t next_used_limit = used + additional_pages; + + if (next_used_limit == heap_pages_used) next_used_limit++; + heap_pages_increment = next_used_limit - used; heap_pages_expand_sorted(objspace); - - if (0) fprintf(stderr, "heap_set_increment: heap_pages_length: %d, heap_pages_used: %d, heap_pages_increment: %d, next_used_limit: %d\n", - (int)heap_pages_length, (int)heap_pages_used, (int)heap_pages_increment, (int)next_used_limit); } static int @@ -2855,7 +2859,7 @@ gc_heap_prepare_minimum_pages(rb_objspace_t *objspace, rb_heap_t *heap) { if (!heap->free_pages) { /* there is no free after page_sweep() */ - heap_set_increment(objspace, 0); + heap_set_increment(objspace, 1); if (!heap_increment(objspace, heap)) { /* can't allocate additional free objects */ during_gc = 0; rb_memerror(); @@ -2994,7 +2998,7 @@ gc_after_sweep(rb_objspace_t *objspace) (int)heap->total_slots, (int)heap_pages_swept_slots, (int)heap_pages_min_free_slots); if (heap_pages_swept_slots < heap_pages_min_free_slots) { - heap_set_increment(objspace, (heap_pages_min_free_slots - heap_pages_swept_slots) / HEAP_OBJ_LIMIT); + heap_set_increment(objspace, heap_extend_pages(objspace)); heap_increment(objspace, heap); #if USE_RGENGC @@ -5064,7 +5068,7 @@ heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap) if (dont_gc || during_gc) { if (!heap->freelist && !heap->free_pages) { if (!heap_increment(objspace, heap)) { - heap_set_increment(objspace, 0); + heap_set_increment(objspace, 1); heap_increment(objspace, heap); } } From 96062ac0350a6c6ba466c09b38fdcbc2e365d0d6 Mon Sep 17 00:00:00 2001 From: ko1 Date: Mon, 9 Jun 2014 11:43:23 +0000 Subject: [PATCH 2/2] * gc.c: change full GC timing to keep lower memory usage. Extend heap only at (1) after major GC or (2) after several (two times, at current) minor GC Details in https://bugs.ruby-lang.org/issues/9607#note-9 [Bug #9607] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46387 b2dd03c8-39d4-4d8f-98ff-823fe69b080e Conflicts: ChangeLog gc.c --- gc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gc.c b/gc.c index 53361740908f76..4c00d96d2e6626 100644 --- a/gc.c +++ b/gc.c @@ -541,6 +541,9 @@ typedef struct rb_objspace { int parent_object_is_old; int need_major_gc; + + size_t last_major_gc; + size_t remembered_shady_object_count; size_t remembered_shady_object_limit; size_t old_object_count; @@ -2998,15 +3001,13 @@ gc_after_sweep(rb_objspace_t *objspace) (int)heap->total_slots, (int)heap_pages_swept_slots, (int)heap_pages_min_free_slots); if (heap_pages_swept_slots < heap_pages_min_free_slots) { - heap_set_increment(objspace, heap_extend_pages(objspace)); - heap_increment(objspace, heap); - -#if USE_RGENGC - if (objspace->rgengc.remembered_shady_object_count + objspace->rgengc.old_object_count > (heap_pages_length * HEAP_OBJ_LIMIT) / 2) { - /* if [old]+[remembered shady] > [all object count]/2, then do major GC */ - objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_RESCAN; + if (objspace->rgengc.during_minor_gc && objspace->profile.count - objspace->rgengc.last_major_gc > 2 /* magic number */) { + objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_NOFREE; + } + else { + heap_set_increment(objspace, heap_extend_pages(objspace)); + heap_increment(objspace, heap); } -#endif } gc_prof_set_heap_info(objspace); @@ -4189,6 +4190,7 @@ gc_marks_body(rb_objspace_t *objspace, int full_mark) } else { objspace->profile.major_gc_count++; + objspace->rgengc.last_major_gc = objspace->profile.count; rgengc_mark_and_rememberset_clear(objspace, heap_eden); } #endif pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy