[sgen] Log also the real size used by the major objects
authorVlad Brezae <brezaevlad@gmail.com>
Mon, 9 May 2016 11:38:32 +0000 (14:38 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Wed, 18 May 2016 20:53:13 +0000 (23:53 +0300)
Due to performance concerns, we don't account for the space wasted in blocks, since it would require dereferencing all vtables. We also don't account for allocation that might happen during sweep.

mono/metadata/sgen-mono.c
mono/sgen/sgen-client.h
mono/sgen/sgen-gc.h
mono/sgen/sgen-marksweep.c
mono/sgen/sgen-memory-governor.c
mono/sgen/sgen-memory-governor.h

index a99eff3132351fb0a9fe155725c9d2ecdf664b01..63d16f620d468c1655f9ffb6cee487d029382653 100644 (file)
@@ -2718,7 +2718,7 @@ sgen_client_degraded_allocation (size_t size)
 }
 
 void
-sgen_client_log_timing (GGTimingInfo *info, mword promoted_size)
+sgen_client_log_timing (GGTimingInfo *info, mword promoted_size, mword major_used_size)
 {
        SgenMajorCollector *major_collector = sgen_get_major_collector ();
        mword num_major_sections = major_collector->get_num_major_sections ();
@@ -2736,13 +2736,14 @@ sgen_client_log_timing (GGTimingInfo *info, mword promoted_size)
                        los_memory_usage_total / 1024,
                        los_memory_usage / 1024);
        else
-               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_MINOR%s: (%s) pause %.2fms, %s promoted %dK major %dK los size: %dK in use: %dK",
+               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_MINOR%s: (%s) pause %.2fms, %s promoted %dK major size: %dK in use: %dK los size: %dK in use: %dK",
                                info->is_overflow ? "_OVERFLOW" : "",
                        info->reason ? info->reason : "",
                        (int)info->total_time / 10000.0f,
                        full_timing_buff,
                        (int)promoted_size / 1024,
                        major_collector->section_size * num_major_sections / 1024,
+                       major_used_size / 1024,
                        los_memory_usage_total / 1024,
                        los_memory_usage / 1024);
 }
index 9d8f151ec2fb1ccaf0743b7e2edd3a3a6f96f378..852d93e366217d9c50f45f136db0845950d02335 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 promoted_size);
+void sgen_client_log_timing (GGTimingInfo *info, mword promoted_size, mword major_used_size);
 
 /*
  * Called to handle `MONO_GC_PARAMS` and `MONO_GC_DEBUG` options.  The `handle` functions
index c4e3a3fa037da7a26f6a6ac5d0ff42737256101e..c76052ed18d42fe47889a5040c81f24f1184857f 100644 (file)
@@ -953,6 +953,7 @@ extern guint32 tlab_size;
 extern NurseryClearPolicy nursery_clear_policy;
 extern gboolean sgen_try_free_some_memory;
 extern mword total_promoted_size;
+extern mword total_allocated_major;
 
 extern MonoCoopMutex gc_mutex;
 
index 4c63191ad447d0ea5c9fb76bf44f9eba3ee19b46..dad1b249af11f4c68e570f0c11d63d9fe960b8d9 100644 (file)
@@ -652,6 +652,8 @@ alloc_obj (GCVTable vtable, size_t size, gboolean pinned, gboolean has_reference
        /* FIXME: assumes object layout */
        *(GCVTable*)obj = vtable;
 
+       total_allocated_major += block_obj_sizes [size_index]; 
+
        return (GCObject *)obj;
 }
 
@@ -1652,6 +1654,7 @@ sweep_job_func (void *thread_data_untyped, SgenThreadPoolJob *job)
 static void
 sweep_finish (void)
 {
+       mword used_slots_size = 0;
        int i;
 
        for (i = 0; i < num_block_obj_sizes; ++i) {
@@ -1665,9 +1668,11 @@ sweep_finish (void)
                } else {
                        evacuate_block_obj_sizes [i] = FALSE;
                }
+
+               used_slots_size += sweep_slots_used [i] * block_obj_sizes [i];
        }
 
-       sgen_memgov_major_post_sweep ();
+       sgen_memgov_major_post_sweep (used_slots_size);
 
        set_sweep_state (SWEEP_STATE_SWEPT, SWEEP_STATE_COMPACTING);
        if (concurrent_sweep)
index 783ed609ec061ff2bb77b3186071db150ffcd5b0..4648d8d761d444cbb8b6ec411d6fff6d3d2ad4da 100644 (file)
@@ -26,7 +26,9 @@
 #define MIN_MINOR_COLLECTION_ALLOWANCE ((mword)(DEFAULT_NURSERY_SIZE * default_allowance_nursery_size_ratio))
 
 mword total_promoted_size = 0;
+mword total_allocated_major = 0;
 static mword total_promoted_size_start;
+static mword total_allocated_major_end;
 
 /*Heap limits and allocation knobs*/
 static mword max_heap_size = ((mword)0)- ((mword)1);
@@ -55,6 +57,7 @@ static gboolean need_calculate_minor_collection_allowance;
 
 /* The size of the LOS after the last major collection, after sweeping. */
 static mword last_collection_los_memory_usage = 0;
+static mword last_used_slots_size = 0;
 
 static mword sgen_memgov_available_free_space (void);
 
@@ -180,12 +183,14 @@ sgen_memgov_major_pre_sweep (void)
 }
 
 void
-sgen_memgov_major_post_sweep (void)
+sgen_memgov_major_post_sweep (mword used_slots_size)
 {
        mword num_major_sections = major_collector.get_num_major_sections ();
 
-       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_MAJOR_SWEEP: major %dK",
-               num_major_sections * major_collector.section_size / 1024);
+       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_MAJOR_SWEEP: major size: %dK in use: %dK",
+               num_major_sections * major_collector.section_size / 1024,
+               (used_slots_size + total_allocated_major - total_allocated_major_end) / 1024);
+       last_used_slots_size = used_slots_size;
 }
 
 void
@@ -204,6 +209,7 @@ sgen_memgov_major_collection_end (gboolean forced)
 {
        last_collection_los_memory_usage = los_memory_usage;
 
+       total_allocated_major_end = total_allocated_major;
        if (forced) {
                sgen_get_major_collector ()->finish_sweeping ();
                sgen_memgov_calculate_minor_collection_allowance ();
@@ -221,7 +227,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], total_promoted_size - total_promoted_size_start);
+                       sgen_client_log_timing (&info [i], total_promoted_size - total_promoted_size_start, last_used_slots_size + total_allocated_major - total_allocated_major_end);
        }
 }
 
index 9bcd55b4d80ad157417567512f7363438029f468..5e33b042837a983ed97cbbe1cbe84b8ac24833e9 100644 (file)
@@ -17,7 +17,7 @@ void sgen_memgov_minor_collection_start (void);
 void sgen_memgov_minor_collection_end (void);
 
 void sgen_memgov_major_pre_sweep (void);
-void sgen_memgov_major_post_sweep (void);
+void sgen_memgov_major_post_sweep (mword used_slots_size);
 void sgen_memgov_major_collection_start (void);
 void sgen_memgov_major_collection_end (gboolean forced);