From 51db8af409f0a386dc26a1fa674f923db0dcc6a3 Mon Sep 17 00:00:00 2001 From: Gabriel Baraldi Date: Fri, 3 Mar 2023 14:32:51 -0300 Subject: [PATCH] Fix heapsize hint and use a line for max memory (#48747) * Fix heapsize hint and use a line so that large machines utilize more of their ram --- src/gc.c | 16 +++++++++++++--- src/jl_exported_funcs.inc | 1 + src/julia.h | 1 + test/cmdlineargs.jl | 2 ++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gc.c b/src/gc.c index 743c5704a53cb..88df8cfeb7aa4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -3228,8 +3228,6 @@ void jl_init_thread_heap(jl_ptls_t ptls) // System-wide initializations void jl_gc_init(void) { - if (jl_options.heap_size_hint) - jl_gc_set_max_memory(jl_options.heap_size_hint); JL_MUTEX_INIT(&heapsnapshot_lock); JL_MUTEX_INIT(&finalizers_lock); @@ -3253,8 +3251,15 @@ void jl_gc_init(void) uint64_t constrained_mem = uv_get_constrained_memory(); if (constrained_mem > 0 && constrained_mem < total_mem) total_mem = constrained_mem; - max_total_memory = total_mem / 10 * 6; + double percent; + if (total_mem < 128e9) + percent = total_mem * 2.34375e-12 + 0.6; // 60% at 0 gigs and 90% at 128 to not + else // overcommit too much on memory contrained devices + percent = 0.9; + max_total_memory = total_mem * percent; #endif + if (jl_options.heap_size_hint) + jl_gc_set_max_memory(jl_options.heap_size_hint); t_start = jl_hrtime(); } @@ -3267,6 +3272,11 @@ JL_DLLEXPORT void jl_gc_set_max_memory(uint64_t max_mem) } } +JL_DLLEXPORT uint64_t jl_gc_get_max_memory(void) +{ + return max_total_memory; +} + // callback for passing OOM errors from gmp JL_DLLEXPORT void jl_throw_out_of_memory_error(void) { diff --git a/src/jl_exported_funcs.inc b/src/jl_exported_funcs.inc index c5389978217d6..b84c3338e401a 100644 --- a/src/jl_exported_funcs.inc +++ b/src/jl_exported_funcs.inc @@ -172,6 +172,7 @@ XX(jl_gc_external_obj_hdr_size) \ XX(jl_gc_find_taggedvalue_pool) \ XX(jl_gc_get_total_bytes) \ + XX(jl_gc_get_max_memory) \ XX(jl_gc_internal_obj_base_ptr) \ XX(jl_gc_is_enabled) \ XX(jl_gc_live_bytes) \ diff --git a/src/julia.h b/src/julia.h index 4374c8a7ceeed..f2b6823a133e3 100644 --- a/src/julia.h +++ b/src/julia.h @@ -921,6 +921,7 @@ JL_DLLEXPORT void jl_free_stack(void *stkbuf, size_t bufsz); JL_DLLEXPORT void jl_gc_use(jl_value_t *a); // Set GC memory trigger in bytes for greedy memory collecting JL_DLLEXPORT void jl_gc_set_max_memory(uint64_t max_mem); +JL_DLLEXPORT uint64_t jl_gc_get_max_memory(void); JL_DLLEXPORT void jl_clear_malloc_data(void); diff --git a/test/cmdlineargs.jl b/test/cmdlineargs.jl index 0917f4c4257f3..eafcb4ebe89d0 100644 --- a/test/cmdlineargs.jl +++ b/test/cmdlineargs.jl @@ -901,4 +901,6 @@ end @test lines[3] == "foo" @test lines[4] == "bar" end +#heap-size-hint +@test readchomp(`$(Base.julia_cmd()) --startup-file=no --heap-size-hint=500M -e "println(@ccall jl_gc_get_max_memory()::UInt64)"`) == "524288000" end