@@ -541,6 +541,9 @@ typedef struct rb_objspace {
541541int parent_object_is_old ;
542542
543543int need_major_gc ;
544+
545+ size_t last_major_gc ;
546+
544547size_t remembered_shady_object_count ;
545548size_t remembered_shady_object_limit ;
546549size_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 ) {
12021206size_t max_used_limit = (size_t )(used + gc_params .growth_max_slots /HEAP_OBJ_LIMIT );
12031207if (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
12181225static 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 );
28592866if (!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 {
41874192objspace -> profile .major_gc_count ++ ;
4193+ objspace -> rgengc .last_major_gc = objspace -> profile .count ;
41884194rgengc_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 ) {
50655071if (!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