Index: runtime/vm/heap.cc |
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc |
index 975d0d55c27a38cdea105418f05c13953f0103a2..634b75d31f71961cb0ed8e9b328e0823aa68e57f 100644 |
--- a/runtime/vm/heap.cc |
+++ b/runtime/vm/heap.cc |
@@ -364,6 +364,21 @@ void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) { |
} |
#endif |
rmacnak
2017/06/30 22:24:56
Two lines between functions (clang-format doesn't
danunez
2017/06/30 22:33:58
Done.
|
+void Heap::EvacuateNewSpaceGarbage(Thread* thread, GCReason reason) { |
+ ASSERT(reason == kFull); |
+ if (BeginNewSpaceGC(thread)) { |
+ RecordBeforeGC(kNew, kFull); |
+ VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId); |
+ TIMELINE_FUNCTION_GC_DURATION(thread, "CollectNewGeneration"); |
rmacnak
2017/06/30 22:24:56
"EvacuateNewGeneration"
danunez
2017/06/30 22:33:58
Done.
|
+ NOT_IN_PRODUCT(UpdateClassHeapStatsBeforeGC(kNew)); |
+ new_space_.Evacuate(); |
+ NOT_IN_PRODUCT(isolate()->class_table()->UpdatePromoted()); |
+ RecordAfterGC(kNew); |
+ PrintStats(); |
+ NOT_IN_PRODUCT(PrintStatsToTimeline(&tds)); |
+ EndNewSpaceGC(); |
+ } |
+} |
rmacnak
2017/06/30 22:24:56
Two lines
danunez
2017/06/30 22:33:58
Done.
|
void Heap::CollectNewSpaceGarbage(Thread* thread, |
ApiCallbacks api_callbacks, |
@@ -444,7 +459,10 @@ void Heap::CollectGarbage(Space space) { |
void Heap::CollectAllGarbage() { |
Thread* thread = Thread::Current(); |
- CollectNewSpaceGarbage(thread, kInvokeApiCallbacks, kFull); |
+ |
+ // New space is evacuated so this GC will collect all dead objects |
+ // kept alive by a cross-generational pointer. |
+ EvacuateNewSpaceGarbage(thread, kFull); |
CollectOldSpaceGarbage(thread, kInvokeApiCallbacks, kFull); |
} |