@@ -541,6 +541,9 @@ typedef struct rb_objspace {
541
541
int parent_object_is_old ;
542
542
543
543
int need_major_gc ;
544
+
545
+ size_t last_major_gc ;
546
+
544
547
size_t remembered_shady_object_count ;
545
548
size_t remembered_shady_object_limit ;
546
549
size_t old_object_count ;
@@ -1193,26 +1196,30 @@ heap_add_pages(rb_objspace_t *objspace, rb_heap_t *heap, size_t add)
1193
1196
heap_pages_increment = 0 ;
1194
1197
}
1195
1198
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 )
1198
1201
{
1199
1202
size_t used = heap_pages_used - heap_tomb -> page_length ;
1200
1203
size_t next_used_limit = (size_t )(used * gc_params .growth_factor );
1204
+
1201
1205
if (gc_params .growth_max_slots > 0 ) {
1202
1206
size_t max_used_limit = (size_t )(used + gc_params .growth_max_slots /HEAP_OBJ_LIMIT );
1203
1207
if (next_used_limit > max_used_limit ) next_used_limit = max_used_limit ;
1204
1208
}
1205
- if (next_used_limit == heap_pages_used ) next_used_limit ++ ;
1206
1209
1207
- if (next_used_limit < minimum_limit ) {
1208
- next_used_limit = minimum_limit ;
1210
+ return next_used_limit - used ;
1209
1211
}
1210
1212
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
+
1211
1221
heap_pages_increment = next_used_limit - used ;
1212
1222
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 );
1216
1223
}
1217
1224
1218
1225
static int
@@ -2855,7 +2862,7 @@ gc_heap_prepare_minimum_pages(rb_objspace_t *objspace, rb_heap_t *heap)
2855
2862
{
2856
2863
if (!heap -> free_pages ) {
2857
2864
/* there is no free after page_sweep() */
2858
- heap_set_increment (objspace , 0 );
2865
+ heap_set_increment (objspace , 1 );
2859
2866
if (!heap_increment (objspace , heap )) { /* can't allocate additional free objects */
2860
2867
during_gc = 0 ;
2861
2868
rb_memerror ();
@@ -2994,15 +3001,13 @@ gc_after_sweep(rb_objspace_t *objspace)
2994
3001
(int )heap -> total_slots , (int )heap_pages_swept_slots , (int )heap_pages_min_free_slots );
2995
3002
2996
3003
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 );
3004
3010
}
3005
- #endif
3006
3011
}
3007
3012
3008
3013
gc_prof_set_heap_info (objspace );
@@ -4185,6 +4190,7 @@ gc_marks_body(rb_objspace_t *objspace, int full_mark)
4185
4190
}
4186
4191
else {
4187
4192
objspace -> profile .major_gc_count ++ ;
4193
+ objspace -> rgengc .last_major_gc = objspace -> profile .count ;
4188
4194
rgengc_mark_and_rememberset_clear (objspace , heap_eden );
4189
4195
}
4190
4196
#endif
@@ -5064,7 +5070,7 @@ heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap)
5064
5070
if (dont_gc || during_gc ) {
5065
5071
if (!heap -> freelist && !heap -> free_pages ) {
5066
5072
if (!heap_increment (objspace , heap )) {
5067
- heap_set_increment (objspace , 0 );
5073
+ heap_set_increment (objspace , 1 );
5068
5074
heap_increment (objspace , heap );
5069
5075
}
5070
5076
}
0 commit comments