Skip to content

Commit 05efc56

Browse files
committed
Change a few things in collection heuristics, there may be some time/memory regressions. Repair finalizer timing in GC_FINAL_STATS
1 parent 7123b1f commit 05efc56

File tree

4 files changed

+24
-18
lines changed

4 files changed

+24
-18
lines changed

base/base.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ end
149149

150150
finalize(o::ANY) = ccall(:jl_finalize, Void, (Any,), o)
151151

152-
gc() = ccall(:jl_gc_collect, Void, ())
152+
gc(full = true) = ccall(:jl_gc_collect, Void, (Int,), full ? 1 : 0)
153153
gc_enable() = ccall(:jl_gc_enable, Void, ())
154154
gc_disable() = ccall(:jl_gc_disable, Void, ())
155155

src/dump.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1339,8 +1339,8 @@ extern jl_array_t *jl_module_init_order;
13391339

13401340
DLLEXPORT void jl_save_system_image(char *fname)
13411341
{
1342-
jl_gc_collect();
1343-
jl_gc_collect();
1342+
jl_gc_collect(1);
1343+
jl_gc_collect(0);
13441344
int en = jl_gc_is_enabled();
13451345
jl_gc_disable();
13461346
htable_reset(&backref_table, 250000);

src/gc.c

+20-14
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ static inline void free_page(void *p)
521521
static inline int maybe_collect(void)
522522
{
523523
if (should_collect()) {
524-
jl_gc_collect();
524+
jl_gc_collect(0);
525525
return 1;
526526
}
527527
return 0;
@@ -957,7 +957,7 @@ static inline void *__pool_alloc(pool_t* p, int osize, int end_offset)
957957
gcval_t *v, *end;
958958
if (__unlikely((allocd_bytes += osize) >= 0)) {
959959
// allocd_bytes -= osize;
960-
jl_gc_collect();
960+
jl_gc_collect(0);
961961
// allocd_bytes += osize;
962962
}
963963
v = p->freelist;
@@ -2047,7 +2047,7 @@ static void clear_mark(int);
20472047
#endif
20482048

20492049

2050-
void jl_gc_collect(void)
2050+
void jl_gc_collect(int full)
20512051
{
20522052
if (!is_gc_enabled) return;
20532053
if (jl_in_gc) return;
@@ -2142,12 +2142,12 @@ void jl_gc_collect(void)
21422142
int64_t actual_allocd = allocd_bytes_since_sweep;
21432143
if (!sweeping) {
21442144
// marking is over
2145-
#ifdef GC_TIME
2145+
#if defined(GC_TIME) || defined(GC_FINAL_STATS)
21462146
post_time = jl_hrtime();
21472147
#endif
21482148
// 4. check for objects to finalize
21492149
post_mark();
2150-
#ifdef GC_TIME
2150+
#if defined(GC_TIME) || defined(GC_FINAL_STATS)
21512151
post_time = jl_hrtime() - post_time;
21522152
#endif
21532153
estimate_freed = live_bytes - scanned_bytes - perm_scanned_bytes + actual_allocd;
@@ -2168,16 +2168,22 @@ void jl_gc_collect(void)
21682168
total_allocd_bytes += allocd_bytes_since_sweep;
21692169

21702170
// 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?
21742175
}
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+
}
21782182
}
2183+
sweep_mask = GC_MARKED;
2184+
quick_count = 0;
21792185
} else {
2180-
collect_interval = default_collect_interval;
2186+
collect_interval = default_collect_interval/8;
21812187
sweep_mask = GC_MARKED_NOESC;
21822188
}
21832189
if (sweep_mask == GC_MARKED)
@@ -2260,7 +2266,7 @@ void jl_gc_collect(void)
22602266
}
22612267
#endif
22622268
if (recollect)
2263-
jl_gc_collect();
2269+
jl_gc_collect(0);
22642270
}
22652271

22662272
#if 0
@@ -2323,7 +2329,7 @@ void jl_gc_collect(void)
23232329
// if a lot of objects were finalized, re-run GC to finish freeing
23242330
// their storage if possible.
23252331
if (nfinal > 100000)
2326-
jl_gc_collect();
2332+
jl_gc_collect(0);
23272333
}
23282334
}
23292335

src/julia.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ DLLEXPORT int64_t jl_gc_total_bytes(void);
10791079
DLLEXPORT uint64_t jl_gc_total_hrtime(void);
10801080
int64_t diff_gc_total_bytes(void);
10811081
void sync_gc_total_bytes(void);
1082-
DLLEXPORT void jl_gc_collect(void);
1082+
DLLEXPORT void jl_gc_collect(int full);
10831083
void jl_gc_preserve(jl_value_t *v);
10841084
void jl_gc_unpreserve(void);
10851085
int jl_gc_n_preserved_values(void);

0 commit comments

Comments
 (0)