From 1a9542c9697519aed99ceca0bc2dd08b2817655d Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Mon, 9 May 2016 02:24:54 +0300 Subject: [PATCH] [sgen] Precisely log the size of the promoted objects during minors --- mono/metadata/sgen-mono.c | 4 ++-- mono/sgen/sgen-client.h | 2 +- mono/sgen/sgen-gc.h | 1 + mono/sgen/sgen-memory-governor.c | 6 +++++- mono/sgen/sgen-simple-nursery.c | 1 + mono/sgen/sgen-split-nursery.c | 8 ++++++-- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/mono/metadata/sgen-mono.c b/mono/metadata/sgen-mono.c index bbd97e955df..450f7c69627 100644 --- a/mono/metadata/sgen-mono.c +++ b/mono/metadata/sgen-mono.c @@ -2718,7 +2718,7 @@ sgen_client_degraded_allocation (size_t size) } void -sgen_client_log_timing (GGTimingInfo *info, mword last_major_num_sections, mword last_los_memory_usage) +sgen_client_log_timing (GGTimingInfo *info, mword promoted_size, mword last_los_memory_usage) { SgenMajorCollector *major_collector = sgen_get_major_collector (); mword num_major_sections = major_collector->get_num_major_sections (); @@ -2741,7 +2741,7 @@ sgen_client_log_timing (GGTimingInfo *info, mword last_major_num_sections, mword info->reason ? info->reason : "", (int)info->total_time / 10000.0f, full_timing_buff, - (num_major_sections - last_major_num_sections) * major_collector->section_size / 1024, + (int)promoted_size / 1024, major_collector->section_size * num_major_sections / 1024, los_memory_usage / 1024); } diff --git a/mono/sgen/sgen-client.h b/mono/sgen/sgen-client.h index 4cf9f003d55..d8794354666 100644 --- a/mono/sgen/sgen-client.h +++ b/mono/sgen/sgen-client.h @@ -201,7 +201,7 @@ void sgen_client_clear_togglerefs (char *start, char *end, ScanCopyContext ctx); * Called after collections, reporting the amount of time they took. No action is * necessary. */ -void sgen_client_log_timing (GGTimingInfo *info, mword last_major_num_sections, mword last_los_memory_usage); +void sgen_client_log_timing (GGTimingInfo *info, mword promoted_size, mword last_los_memory_usage); /* * Called to handle `MONO_GC_PARAMS` and `MONO_GC_DEBUG` options. The `handle` functions diff --git a/mono/sgen/sgen-gc.h b/mono/sgen/sgen-gc.h index f3d868a5416..5c9d7df329f 100644 --- a/mono/sgen/sgen-gc.h +++ b/mono/sgen/sgen-gc.h @@ -951,6 +951,7 @@ extern int default_nursery_size; extern guint32 tlab_size; extern NurseryClearPolicy nursery_clear_policy; extern gboolean sgen_try_free_some_memory; +extern mword total_promoted_size; extern MonoCoopMutex gc_mutex; diff --git a/mono/sgen/sgen-memory-governor.c b/mono/sgen/sgen-memory-governor.c index 7415ce3bff1..9d56af89ff9 100644 --- a/mono/sgen/sgen-memory-governor.c +++ b/mono/sgen/sgen-memory-governor.c @@ -25,6 +25,9 @@ #define MIN_MINOR_COLLECTION_ALLOWANCE ((mword)(DEFAULT_NURSERY_SIZE * default_allowance_nursery_size_ratio)) +mword total_promoted_size = 0; +static mword total_promoted_size_start; + /*Heap limits and allocation knobs*/ static mword max_heap_size = ((mword)0)- ((mword)1); static mword soft_heap_limit = ((mword)0) - ((mword)1); @@ -160,6 +163,7 @@ sgen_need_major_collection (mword space_needed) void sgen_memgov_minor_collection_start (void) { + total_promoted_size_start = total_promoted_size; } void @@ -222,7 +226,7 @@ sgen_memgov_collection_end (int generation, GGTimingInfo* info, int info_count) int i; for (i = 0; i < info_count; ++i) { if (info[i].generation != -1) - sgen_client_log_timing (&info [i], last_major_num_sections, last_los_memory_usage); + sgen_client_log_timing (&info [i], total_promoted_size - total_promoted_size_start, last_los_memory_usage); } last_los_memory_usage = los_memory_usage; } diff --git a/mono/sgen/sgen-simple-nursery.c b/mono/sgen/sgen-simple-nursery.c index 56a235aa30f..62c14a5392b 100644 --- a/mono/sgen/sgen-simple-nursery.c +++ b/mono/sgen/sgen-simple-nursery.c @@ -22,6 +22,7 @@ static inline GCObject* alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references) { + total_promoted_size += objsize; return major_collector.alloc_object (vtable, objsize, has_references); } diff --git a/mono/sgen/sgen-split-nursery.c b/mono/sgen/sgen-split-nursery.c index 3606607809e..3b7ae668a20 100644 --- a/mono/sgen/sgen-split-nursery.c +++ b/mono/sgen/sgen-split-nursery.c @@ -254,8 +254,10 @@ alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean ha int age; age = get_object_age (obj); - if (age >= promote_age) + if (age >= promote_age) { + total_promoted_size += objsize; return major_collector.alloc_object (vtable, objsize, has_references); + } /* Promote! */ ++age; @@ -265,8 +267,10 @@ alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean ha age_alloc_buffers [age].next += objsize; } else { p = alloc_for_promotion_slow_path (age, objsize); - if (!p) + if (!p) { + total_promoted_size += objsize; return major_collector.alloc_object (vtable, objsize, has_references); + } } /* FIXME: assumes object layout */ -- 2.25.1