Index: runtime/vm/heap.cc |
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc |
index 63d0c9d75758c49981b45c49dd23f1813fd5e43c..ca05ed41e368dbd16d1f7a09927007c1b488a958 100644 |
--- a/runtime/vm/heap.cc |
+++ b/runtime/vm/heap.cc |
@@ -160,6 +160,7 @@ void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) { |
switch (space) { |
case kNew: { |
RecordBeforeGC(kNew, kNewSpace); |
+ UpdateClassHeapStatsBeforeGC(kNew); |
new_space_->Scavenge(invoke_api_callbacks); |
RecordAfterGC(); |
PrintStats(); |
@@ -173,6 +174,7 @@ void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) { |
case kCode: { |
bool promotion_failure = new_space_->HadPromotionFailure(); |
RecordBeforeGC(kOld, promotion_failure ? kPromotionFailure : kOldSpace); |
+ UpdateClassHeapStatsBeforeGC(kOld); |
old_space_->MarkSweep(invoke_api_callbacks); |
RecordAfterGC(); |
PrintStats(); |
@@ -192,6 +194,17 @@ void Heap::UpdateObjectHistogram() { |
} |
+void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) { |
+ Isolate* isolate = Isolate::Current(); |
+ ClassTable* class_table = isolate->class_table(); |
+ if (space == kNew) { |
+ class_table->ResetCountersNew(); |
+ } else { |
+ class_table->ResetCountersOld(); |
+ } |
+} |
+ |
+ |
void Heap::CollectGarbage(Space space) { |
ApiCallbacks api_callbacks; |
if (space == kOld) { |
@@ -205,10 +218,12 @@ void Heap::CollectGarbage(Space space) { |
void Heap::CollectAllGarbage() { |
RecordBeforeGC(kNew, kFull); |
+ UpdateClassHeapStatsBeforeGC(kNew); |
new_space_->Scavenge(kInvokeApiCallbacks); |
RecordAfterGC(); |
PrintStats(); |
RecordBeforeGC(kOld, kFull); |
+ UpdateClassHeapStatsBeforeGC(kOld); |
old_space_->MarkSweep(kInvokeApiCallbacks); |
RecordAfterGC(); |
PrintStats(); |