Skip to content

Commit 71c08a8

Browse files
committed
Merge pull request #19 from github/2.1-gc-heap-growth
Backport 2.1 gc heap growth patch
2 parents 339fad1 + 96062ac commit 71c08a8

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

gc.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,9 @@ typedef struct rb_objspace {
541541
int parent_object_is_old;
542542

543543
int need_major_gc;
544+
545+
size_t last_major_gc;
546+
544547
size_t remembered_shady_object_count;
545548
size_t remembered_shady_object_limit;
546549
size_t old_object_count;
@@ -1193,26 +1196,30 @@ heap_add_pages(rb_objspace_t *objspace, rb_heap_t *heap, size_t add)
11931196
heap_pages_increment = 0;
11941197
}
11951198

1196-
static void
1197-
heap_set_increment(rb_objspace_t *objspace, size_t minimum_limit)
1199+
static size_t
1200+
heap_extend_pages(rb_objspace_t *objspace)
11981201
{
11991202
size_t used = heap_pages_used - heap_tomb->page_length;
12001203
size_t next_used_limit = (size_t)(used * gc_params.growth_factor);
1204+
12011205
if (gc_params.growth_max_slots > 0) {
12021206
size_t max_used_limit = (size_t)(used + gc_params.growth_max_slots/HEAP_OBJ_LIMIT);
12031207
if (next_used_limit > max_used_limit) next_used_limit = max_used_limit;
12041208
}
1205-
if (next_used_limit == heap_pages_used) next_used_limit++;
12061209

1207-
if (next_used_limit < minimum_limit) {
1208-
next_used_limit = minimum_limit;
1210+
return next_used_limit - used;
12091211
}
12101212

1213+
static void
1214+
heap_set_increment(rb_objspace_t *objspace, size_t additional_pages)
1215+
{
1216+
size_t used = heap_eden->page_length;
1217+
size_t next_used_limit = used + additional_pages;
1218+
1219+
if (next_used_limit == heap_pages_used) next_used_limit++;
1220+
12111221
heap_pages_increment = next_used_limit - used;
12121222
heap_pages_expand_sorted(objspace);
1213-
1214-
if (0) fprintf(stderr, "heap_set_increment: heap_pages_length: %d, heap_pages_used: %d, heap_pages_increment: %d, next_used_limit: %d\n",
1215-
(int)heap_pages_length, (int)heap_pages_used, (int)heap_pages_increment, (int)next_used_limit);
12161223
}
12171224

12181225
static int
@@ -2855,7 +2862,7 @@ gc_heap_prepare_minimum_pages(rb_objspace_t *objspace, rb_heap_t *heap)
28552862
{
28562863
if (!heap->free_pages) {
28572864
/* there is no free after page_sweep() */
2858-
heap_set_increment(objspace, 0);
2865+
heap_set_increment(objspace, 1);
28592866
if (!heap_increment(objspace, heap)) { /* can't allocate additional free objects */
28602867
during_gc = 0;
28612868
rb_memerror();
@@ -2994,15 +3001,13 @@ gc_after_sweep(rb_objspace_t *objspace)
29943001
(int)heap->total_slots, (int)heap_pages_swept_slots, (int)heap_pages_min_free_slots);
29953002

29963003
if (heap_pages_swept_slots < heap_pages_min_free_slots) {
2997-
heap_set_increment(objspace, (heap_pages_min_free_slots - heap_pages_swept_slots) / HEAP_OBJ_LIMIT);
2998-
heap_increment(objspace, heap);
2999-
3000-
#if USE_RGENGC
3001-
if (objspace->rgengc.remembered_shady_object_count + objspace->rgengc.old_object_count > (heap_pages_length * HEAP_OBJ_LIMIT) / 2) {
3002-
/* if [old]+[remembered shady] > [all object count]/2, then do major GC */
3003-
objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_RESCAN;
3004+
if (objspace->rgengc.during_minor_gc && objspace->profile.count - objspace->rgengc.last_major_gc > 2 /* magic number */) {
3005+
objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_NOFREE;
3006+
}
3007+
else {
3008+
heap_set_increment(objspace, heap_extend_pages(objspace));
3009+
heap_increment(objspace, heap);
30043010
}
3005-
#endif
30063011
}
30073012

30083013
gc_prof_set_heap_info(objspace);
@@ -4185,6 +4190,7 @@ gc_marks_body(rb_objspace_t *objspace, int full_mark)
41854190
}
41864191
else {
41874192
objspace->profile.major_gc_count++;
4193+
objspace->rgengc.last_major_gc = objspace->profile.count;
41884194
rgengc_mark_and_rememberset_clear(objspace, heap_eden);
41894195
}
41904196
#endif
@@ -5064,7 +5070,7 @@ heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap)
50645070
if (dont_gc || during_gc) {
50655071
if (!heap->freelist && !heap->free_pages) {
50665072
if (!heap_increment(objspace, heap)) {
5067-
heap_set_increment(objspace, 0);
5073+
heap_set_increment(objspace, 1);
50685074
heap_increment(objspace, heap);
50695075
}
50705076
}

0 commit comments

Comments
 (0)