diff options
author | Rodrigo Kumpera <kumpera@gmail.com> | 2012-11-29 21:47:40 +0400 |
---|---|---|
committer | Rodrigo Kumpera <kumpera@gmail.com> | 2012-11-29 23:06:48 +0400 |
commit | 6d607ca572994f8bad63888dd36b4915cdfef6eb (patch) | |
tree | 37bef393ab2718a351e30982b2b8042c4991fe08 | |
parent | 74b96c4c81daa1fbb9202c5becb91bfc9c2b5a99 (diff) |
Add stats for cards remarked by the gc and left untouched by the mutator after.
* sgen-cardtable.c: A nursery object might not be promoted if it's pinned
or, unlikely, the major heap is full. Under those circumstances we need
to remark the card and leave the object behind.
With this we can see how many extra cards are kept due to pinning.
-rw-r--r-- | mono/metadata/sgen-cardtable.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/mono/metadata/sgen-cardtable.c b/mono/metadata/sgen-cardtable.c index 4fad8b6678a..3976a0d833e 100644 --- a/mono/metadata/sgen-cardtable.c +++ b/mono/metadata/sgen-cardtable.c @@ -599,7 +599,7 @@ LOOP_HEAD: #ifdef CARDTABLE_STATS typedef struct { - int total, marked, remarked; + int total, marked, remarked, gc_marked; } card_stats; static card_stats major_stats, los_stats; @@ -610,9 +610,12 @@ count_marked_cards (mword start, mword size) { mword end = start + size; while (start <= end) { + guint8 card = *sgen_card_table_get_card_address (start); ++cur_stats->total; - if (sgen_card_table_address_is_marked (start)) + if (card) ++cur_stats->marked; + if (card == 2) + ++cur_stats->gc_marked; start += CARD_SIZE_IN_BYTES; } } @@ -622,8 +625,10 @@ count_remarked_cards (mword start, mword size) { mword end = start + size; while (start <= end) { - if (sgen_card_table_address_is_marked (start)) + if (sgen_card_table_address_is_marked (start)) { ++cur_stats->remarked; + *sgen_card_table_get_card_address (start) = 2; + } start += CARD_SIZE_IN_BYTES; } } @@ -643,12 +648,12 @@ sgen_card_tables_collect_stats (gboolean begin) sgen_los_iterate_live_block_ranges (count_marked_cards); } else { cur_stats = &major_stats; - sgen_major_collector_iterate_live_block_ranges (count_marked_cards); + sgen_major_collector_iterate_live_block_ranges (count_remarked_cards); cur_stats = &los_stats; sgen_los_iterate_live_block_ranges (count_remarked_cards); - printf ("cards major (t %d m %d r %d) los (t %d m %d r %d) major_scan %.2fms los_scan %.2fms\n", - major_stats.total, major_stats.marked, major_stats.remarked, - los_stats.total, los_stats.marked, los_stats.remarked, + printf ("cards major (t %d m %d g %d r %d) los (t %d m %d g %d r %d) major_scan %.2fms los_scan %.2fms\n", + major_stats.total, major_stats.marked, major_stats.gc_marked, major_stats.remarked, + los_stats.total, los_stats.marked, los_stats.gc_marked, los_stats.remarked, last_major_scan_time / 1000.0, last_los_scan_time / 1000.0); } #endif |