diff --git a/base/timing.jl b/base/timing.jl index bc4bd73d927b2..3a5dcf77aab28 100644 --- a/base/timing.jl +++ b/base/timing.jl @@ -98,6 +98,13 @@ function gc_live_bytes() Int(ccall(:jl_gc_live_bytes, Int64, ())) + num.allocd + num.deferred_alloc end +# must be kept in sync with the value from `src/julia_threads.h`` +const JL_GC_N_MAX_POOLS = 51 +function gc_page_utilization_data() + page_utilization_raw = cglobal(:gc_page_utilization_stats, Float64) + return Base.unsafe_wrap(Array, page_utilization_raw, JL_GC_N_MAX_POOLS, own=false) +end + """ Base.jit_total_bytes() diff --git a/src/gc.c b/src/gc.c index bf5364aaa286d..904566cdf8d14 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1421,19 +1421,17 @@ int jl_gc_classify_pools(size_t sz, int *osize) // sweep phase gc_fragmentation_stat_t gc_page_fragmentation_stats[JL_GC_N_POOLS]; +JL_DLLEXPORT double gc_page_utilization_stats[JL_GC_N_MAX_POOLS]; STATIC_INLINE void gc_update_page_fragmentation_data(jl_gc_pagemeta_t *pg) JL_NOTSAFEPOINT { -#ifdef GC_MEASURE_PAGE_FRAGMENTATION gc_fragmentation_stat_t *stats = &gc_page_fragmentation_stats[pg->pool_n]; jl_atomic_fetch_add(&stats->n_freed_objs, pg->nfree); jl_atomic_fetch_add(&stats->n_pages_allocd, 1); -#endif } STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT { -#ifdef GC_MEASURE_PAGE_FRAGMENTATION for (int i = 0; i < JL_GC_N_POOLS; i++) { gc_fragmentation_stat_t *stats = &gc_page_fragmentation_stats[i]; double utilization = 1.0; @@ -1442,12 +1440,10 @@ STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT if (n_pages_allocd != 0) { utilization -= ((double)n_freed_objs * (double)jl_gc_sizeclasses[i]) / (double)n_pages_allocd / (double)GC_PAGE_SZ; } - jl_safe_printf("Size class %d: %.2f%% utilization\n", jl_gc_sizeclasses[i], utilization * 100.0); + gc_page_utilization_stats[i] = utilization; jl_atomic_store_relaxed(&stats->n_freed_objs, 0); jl_atomic_store_relaxed(&stats->n_pages_allocd, 0); } - jl_safe_printf("-----------------------------------------\n"); -#endif } int64_t buffered_pages = 0; diff --git a/src/gc.h b/src/gc.h index 6dceee9053ede..e4facad8efae0 100644 --- a/src/gc.h +++ b/src/gc.h @@ -238,9 +238,6 @@ STATIC_INLINE jl_gc_pagemeta_t *pop_lf_back(jl_gc_page_stack_t *pool) JL_NOTSAFE } } -// data structures for tracking fragmentation in the pool allocator -// #define GC_MEASURE_PAGE_FRAGMENTATION - typedef struct { _Atomic(size_t) n_freed_objs; _Atomic(size_t) n_pages_allocd;