| Index: runtime/vm/heap.cc
|
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
|
| index 975d0d55c27a38cdea105418f05c13953f0103a2..e3c0f127d3bc3fc6f3b900e2fcc746d5bb932ec4 100644
|
| --- a/runtime/vm/heap.cc
|
| +++ b/runtime/vm/heap.cc
|
| @@ -365,6 +365,23 @@ void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) {
|
| #endif
|
|
|
|
|
| +void Heap::EvacuateNewSpace(Thread* thread, GCReason reason) {
|
| + ASSERT(reason == kFull);
|
| + if (BeginNewSpaceGC(thread)) {
|
| + RecordBeforeGC(kNew, kFull);
|
| + VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
|
| + TIMELINE_FUNCTION_GC_DURATION(thread, "CollectNewGeneration");
|
| + NOT_IN_PRODUCT(UpdateClassHeapStatsBeforeGC(kNew));
|
| + new_space_.Evacuate();
|
| + NOT_IN_PRODUCT(isolate()->class_table()->UpdatePromoted());
|
| + RecordAfterGC(kNew);
|
| + PrintStats();
|
| + NOT_IN_PRODUCT(PrintStatsToTimeline(&tds));
|
| + EndNewSpaceGC();
|
| + }
|
| +}
|
| +
|
| +
|
| void Heap::CollectNewSpaceGarbage(Thread* thread,
|
| ApiCallbacks api_callbacks,
|
| GCReason reason) {
|
| @@ -373,7 +390,7 @@ void Heap::CollectNewSpaceGarbage(Thread* thread,
|
| bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
|
| RecordBeforeGC(kNew, reason);
|
| VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
|
| - TIMELINE_FUNCTION_GC_DURATION(thread, "CollectNewGeneration");
|
| + TIMELINE_FUNCTION_GC_DURATION(thread, "EvacuateNewGeneration");
|
| NOT_IN_PRODUCT(UpdateClassHeapStatsBeforeGC(kNew));
|
| new_space_.Scavenge(invoke_api_callbacks);
|
| NOT_IN_PRODUCT(isolate()->class_table()->UpdatePromoted());
|
| @@ -444,7 +461,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.
|
| + EvacuateNewSpace(thread, kFull);
|
| CollectOldSpaceGarbage(thread, kInvokeApiCallbacks, kFull);
|
| }
|
|
|
|
|