[sgen] Precisely log the size of the promoted objects during minors
authorVlad Brezae <brezaevlad@gmail.com>
Sun, 8 May 2016 23:24:54 +0000 (02:24 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Wed, 18 May 2016 20:53:10 +0000 (23:53 +0300)
mono/metadata/sgen-mono.c
mono/sgen/sgen-client.h
mono/sgen/sgen-gc.h
mono/sgen/sgen-memory-governor.c
mono/sgen/sgen-simple-nursery.c
mono/sgen/sgen-split-nursery.c

index bbd97e955df2a69003dafb75b8333c0bb505859b..450f7c696273c87ff90ed49dd8f72f8aab6bb797 100644 (file)
@@ -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);
 }
index 4cf9f003d5584bb55b5c7ab30f9170661647c3f7..d8794354666a993f73cd2abf8b1f71d1648b16fc 100644 (file)
@@ -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
index f3d868a541648015aba3ef73d8a88f8345a30390..5c9d7df329f664b0e3d967a3dc6fc35e21645c49 100644 (file)
@@ -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;
 
index 7415ce3bff1b3ce63468582f8e1d4cc888e0fc3c..9d56af89ff9b1b77827a5c628f76e89bf17ee66b 100644 (file)
@@ -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;
 }
index 56a235aa30f42473511957269500bc45a86870c1..62c14a5392bc394ffef8420e9741629b458d1b2b 100644 (file)
@@ -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);
 }
 
index 3606607809e954c2888f1dceae8b70d0ea4cb135..3b7ae668a203d537bd2372d15d62e7630c5db7e6 100644 (file)
@@ -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 */