@@ -521,7 +521,7 @@ static inline void free_page(void *p)
521
521
static inline int maybe_collect (void )
522
522
{
523
523
if (should_collect ()) {
524
- jl_gc_collect ();
524
+ jl_gc_collect (0 );
525
525
return 1 ;
526
526
}
527
527
return 0 ;
@@ -957,7 +957,7 @@ static inline void *__pool_alloc(pool_t* p, int osize, int end_offset)
957
957
gcval_t * v , * end ;
958
958
if (__unlikely ((allocd_bytes += osize ) >= 0 )) {
959
959
// allocd_bytes -= osize;
960
- jl_gc_collect ();
960
+ jl_gc_collect (0 );
961
961
// allocd_bytes += osize;
962
962
}
963
963
v = p -> freelist ;
@@ -2047,7 +2047,7 @@ static void clear_mark(int);
2047
2047
#endif
2048
2048
2049
2049
2050
- void jl_gc_collect (void )
2050
+ void jl_gc_collect (int full )
2051
2051
{
2052
2052
if (!is_gc_enabled ) return ;
2053
2053
if (jl_in_gc ) return ;
@@ -2142,12 +2142,12 @@ void jl_gc_collect(void)
2142
2142
int64_t actual_allocd = allocd_bytes_since_sweep ;
2143
2143
if (!sweeping ) {
2144
2144
// marking is over
2145
- #ifdef GC_TIME
2145
+ #if defined( GC_TIME ) || defined( GC_FINAL_STATS )
2146
2146
post_time = jl_hrtime ();
2147
2147
#endif
2148
2148
// 4. check for objects to finalize
2149
2149
post_mark ();
2150
- #ifdef GC_TIME
2150
+ #if defined( GC_TIME ) || defined( GC_FINAL_STATS )
2151
2151
post_time = jl_hrtime () - post_time ;
2152
2152
#endif
2153
2153
estimate_freed = live_bytes - scanned_bytes - perm_scanned_bytes + actual_allocd ;
@@ -2168,16 +2168,22 @@ void jl_gc_collect(void)
2168
2168
total_allocd_bytes += allocd_bytes_since_sweep ;
2169
2169
2170
2170
// 5. next collection decision
2171
- if ((estimate_freed <= 1024 || estimate_freed < (7 * (actual_allocd /10 ))) && n_pause > 1 ) {
2172
- if (collect_interval <= 2 * (max_collect_interval /5 )) {
2173
- collect_interval = 5 * (collect_interval /2 );
2171
+ int not_freed_enough = estimate_freed < (7 * (actual_allocd /10 ));
2172
+ if ((full || quick_count >= 128 || not_freed_enough ) && n_pause > 1 ) {
2173
+ if (prev_sweep_mask != GC_MARKED || full ) {
2174
+ if (full ) recollect = 1 ; // TODO enable this?
2174
2175
}
2175
- sweep_mask = GC_MARKED ;
2176
- if (prev_sweep_mask != GC_MARKED ) {
2177
- //recollect = 1; // TODO enable this
2176
+ if (not_freed_enough ) {
2177
+ if (collect_interval < default_collect_interval )
2178
+ collect_interval = default_collect_interval ;
2179
+ else if (collect_interval <= 2 * (max_collect_interval /5 )) {
2180
+ collect_interval = 5 * (collect_interval /2 );
2181
+ }
2178
2182
}
2183
+ sweep_mask = GC_MARKED ;
2184
+ quick_count = 0 ;
2179
2185
} else {
2180
- collect_interval = default_collect_interval ;
2186
+ collect_interval = default_collect_interval / 8 ;
2181
2187
sweep_mask = GC_MARKED_NOESC ;
2182
2188
}
2183
2189
if (sweep_mask == GC_MARKED )
@@ -2260,7 +2266,7 @@ void jl_gc_collect(void)
2260
2266
}
2261
2267
#endif
2262
2268
if (recollect )
2263
- jl_gc_collect ();
2269
+ jl_gc_collect (0 );
2264
2270
}
2265
2271
2266
2272
#if 0
@@ -2323,7 +2329,7 @@ void jl_gc_collect(void)
2323
2329
// if a lot of objects were finalized, re-run GC to finish freeing
2324
2330
// their storage if possible.
2325
2331
if (nfinal > 100000 )
2326
- jl_gc_collect ();
2332
+ jl_gc_collect (0 );
2327
2333
}
2328
2334
}
2329
2335
0 commit comments