From f6a66fafa043953284ee7ca823df4e5219d57640 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Fri, 28 Jul 2023 20:21:08 +0300 Subject: [PATCH] [mono][sgen] Log also size of reserved empty major blocks (#88825) --- src/mono/mono/sgen/sgen-gc.h | 1 + src/mono/mono/sgen/sgen-marksweep.c | 7 +++++++ src/mono/mono/sgen/sgen-memory-governor.c | 9 ++++++--- src/mono/mono/sgen/sgen-memory-governor.h | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/sgen/sgen-gc.h b/src/mono/mono/sgen/sgen-gc.h index 5578c25..eeedb3c 100644 --- a/src/mono/mono/sgen/sgen-gc.h +++ b/src/mono/mono/sgen/sgen-gc.h @@ -716,6 +716,7 @@ struct _SgenMajorCollector { gboolean (*ptr_is_from_pinned_alloc) (char *ptr); void (*report_pinned_memory_usage) (void); size_t (*get_num_major_sections) (void); + size_t (*get_num_empty_blocks) (void); size_t (*get_bytes_survived_last_sweep) (void); gboolean (*handle_gc_param) (const char *opt); void (*print_gc_param_usage) (void); diff --git a/src/mono/mono/sgen/sgen-marksweep.c b/src/mono/mono/sgen/sgen-marksweep.c index b0f7d1d..ce64180 100644 --- a/src/mono/mono/sgen/sgen-marksweep.c +++ b/src/mono/mono/sgen/sgen-marksweep.c @@ -2319,6 +2319,12 @@ get_num_major_sections (void) return num_major_sections; } +static size_t +get_num_empty_blocks (void) +{ + return num_empty_blocks; +} + /* * Returns the number of bytes in blocks that were present when the last sweep was * initiated, and were not freed during the sweep. They are the basis for calculating the @@ -2880,6 +2886,7 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr collector->ptr_is_from_pinned_alloc = ptr_is_from_pinned_alloc; collector->report_pinned_memory_usage = major_report_pinned_memory_usage; collector->get_num_major_sections = get_num_major_sections; + collector->get_num_empty_blocks = get_num_empty_blocks; collector->get_bytes_survived_last_sweep = get_bytes_survived_last_sweep; collector->handle_gc_param = major_handle_gc_param; collector->print_gc_param_usage = major_print_gc_param_usage; diff --git a/src/mono/mono/sgen/sgen-memory-governor.c b/src/mono/mono/sgen/sgen-memory-governor.c index 27b56bf..7d98d96 100644 --- a/src/mono/mono/sgen/sgen-memory-governor.c +++ b/src/mono/mono/sgen/sgen-memory-governor.c @@ -231,6 +231,7 @@ sgen_memgov_minor_collection_end (const char *reason, gboolean is_overflow) log_entry->promoted_size = (mword)sgen_gc_info.total_promoted_bytes; log_entry->major_size = (mword)sgen_gc_info.total_major_size_bytes; log_entry->major_size_in_use = (mword)sgen_gc_info.total_major_size_in_use_bytes; + log_entry->major_empty_reserved_size = (mword)sgen_major_collector.get_num_empty_blocks () * sgen_major_collector.section_size; log_entry->los_size = (mword)sgen_gc_info.total_los_size_bytes; log_entry->los_size_in_use = (mword)sgen_gc_info.total_los_size_in_use_bytes; @@ -333,7 +334,7 @@ sgen_output_log_entry (SgenLogEntry *entry, gint64 stw_time, int generation) switch (entry->type) { case SGEN_LOG_NURSERY: - mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_GC, "GC_MINOR%s: (%s) time %.2fms, %s promoted %luK major size: %luK in use: %luK los size: %luK in use: %luK", + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_GC, "GC_MINOR%s: (%s) time %.2fms, %s promoted %luK major size: %luK in use: %luK empty reserved: %luK los size: %luK in use: %luK", entry->is_overflow ? "_OVERFLOW" : "", entry->reason ? entry->reason : "", entry->time / 10000.0f, @@ -341,6 +342,7 @@ sgen_output_log_entry (SgenLogEntry *entry, gint64 stw_time, int generation) (unsigned long)entry->promoted_size / 1024, (unsigned long)entry->major_size / 1024, (unsigned long)entry->major_size_in_use / 1024, + (unsigned long)entry->major_empty_reserved_size / 1024, (unsigned long)entry->los_size / 1024, (unsigned long)entry->los_size_in_use / 1024); break; @@ -365,9 +367,10 @@ sgen_output_log_entry (SgenLogEntry *entry, gint64 stw_time, int generation) (unsigned long)entry->los_size_in_use / 1024); break; case SGEN_LOG_MAJOR_SWEEP_FINISH: - mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_GC, "GC_MAJOR_SWEEP: major size: %luK in use: %luK", + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_GC, "GC_MAJOR_SWEEP: major size: %luK in use: %luK empty reserved: %luK", (unsigned long)entry->major_size / 1024, - (unsigned long)entry->major_size_in_use / 1024); + (unsigned long)entry->major_size_in_use / 1024, + (unsigned long)entry->major_empty_reserved_size / 1024); break; default: SGEN_ASSERT (0, FALSE, "Invalid log entry type"); diff --git a/src/mono/mono/sgen/sgen-memory-governor.h b/src/mono/mono/sgen/sgen-memory-governor.h index ecb2cf6..c537c6a 100644 --- a/src/mono/mono/sgen/sgen-memory-governor.h +++ b/src/mono/mono/sgen/sgen-memory-governor.h @@ -50,6 +50,7 @@ typedef struct { mword promoted_size; mword major_size; mword major_size_in_use; + mword major_empty_reserved_size; mword los_size; mword los_size_in_use; } SgenLogEntry; -- 2.7.4