Index: src/heap/incremental-marking.cc |
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
index 3e5e6c0697cd505bf49880d407891ef8f938458a..99d0d45c9467a4ac4eaa1c140cb71a4a7312d1b1 100644 |
--- a/src/heap/incremental-marking.cc |
+++ b/src/heap/incremental-marking.cc |
@@ -42,8 +42,8 @@ IncrementalMarking::IncrementalMarking(Heap* heap) |
no_marking_scope_depth_(0), |
unscanned_bytes_of_large_object_(0), |
was_activated_(false), |
- weak_closure_was_overapproximated_(false), |
- weak_closure_approximation_rounds_(0), |
+ finalize_marking_completed_(false), |
+ incremental_marking_finalization_rounds_(0), |
request_type_(COMPLETE_MARKING) {} |
@@ -623,33 +623,57 @@ void IncrementalMarking::StartMarking() { |
} |
-void IncrementalMarking::MarkObjectGroups() { |
- DCHECK(FLAG_overapproximate_weak_closure); |
- DCHECK(!weak_closure_was_overapproximated_); |
+void IncrementalMarking::MarkRoots() { |
+ DCHECK(FLAG_finalize_marking_incrementally); |
+ DCHECK(!finalize_marking_completed_); |
DCHECK(IsMarking()); |
- int old_marking_deque_top = |
- heap_->mark_compact_collector()->marking_deque()->top(); |
+ IncrementalMarkingRootMarkingVisitor visitor(this); |
+ heap_->IterateStrongRoots(&visitor, VISIT_ONLY_STRONG); |
+} |
- heap_->mark_compact_collector()->MarkImplicitRefGroups(&MarkObject); |
+ |
+void IncrementalMarking::MarkObjectGroups() { |
+ DCHECK(FLAG_finalize_marking_incrementally); |
+ DCHECK(!finalize_marking_completed_); |
+ DCHECK(IsMarking()); |
IncrementalMarkingRootMarkingVisitor visitor(this); |
+ heap_->mark_compact_collector()->MarkImplicitRefGroups(&MarkObject); |
heap_->isolate()->global_handles()->IterateObjectGroups( |
&visitor, &MarkCompactCollector::IsUnmarkedHeapObjectWithHeap); |
+ heap_->isolate()->global_handles()->RemoveImplicitRefGroups(); |
+ heap_->isolate()->global_handles()->RemoveObjectGroups(); |
+} |
+ |
+ |
+void IncrementalMarking::FinalizeIncrementally() { |
+ DCHECK(FLAG_finalize_marking_incrementally); |
+ DCHECK(!finalize_marking_completed_); |
+ DCHECK(IsMarking()); |
+ |
+ int old_marking_deque_top = |
+ heap_->mark_compact_collector()->marking_deque()->top(); |
+ |
+ // After finishing incremental marking, we try to discover all unmarked |
+ // objects to reduce the marking load in the final pause. |
+ // 1) We scan and mark the roots again to find all changes to the root set. |
+ // 2) We mark the object groups. |
+ MarkRoots(); |
+ MarkObjectGroups(); |
int marking_progress = |
abs(old_marking_deque_top - |
- heap_->mark_compact_collector()->marking_deque()->top()); |
- |
- ++weak_closure_approximation_rounds_; |
- if ((weak_closure_approximation_rounds_ >= |
- FLAG_max_object_groups_marking_rounds) || |
- (marking_progress < FLAG_min_progress_during_object_groups_marking)) { |
- weak_closure_was_overapproximated_ = true; |
+ heap_->mark_compact_collector()->marking_deque()->top()) / |
+ kPointerSize; |
+ |
+ ++incremental_marking_finalization_rounds_; |
+ if ((incremental_marking_finalization_rounds_ >= |
+ FLAG_max_incremental_marking_finalization_rounds) || |
+ (marking_progress < |
+ FLAG_min_progress_during_incremental_marking_finalization)) { |
+ finalize_marking_completed_ = true; |
} |
- |
- heap_->isolate()->global_handles()->RemoveImplicitRefGroups(); |
- heap_->isolate()->global_handles()->RemoveObjectGroups(); |
} |
@@ -860,13 +884,15 @@ void IncrementalMarking::Finalize() { |
} |
-void IncrementalMarking::OverApproximateWeakClosure(CompletionAction action) { |
- DCHECK(FLAG_overapproximate_weak_closure); |
- DCHECK(!weak_closure_was_overapproximated_); |
+void IncrementalMarking::FinalizeMarking(CompletionAction action) { |
+ DCHECK(FLAG_finalize_marking_incrementally); |
+ DCHECK(!finalize_marking_completed_); |
if (FLAG_trace_incremental_marking) { |
- PrintF("[IncrementalMarking] requesting weak closure overapproximation.\n"); |
+ PrintF( |
+ "[IncrementalMarking] requesting finalization of incremental " |
+ "marking.\n"); |
} |
- request_type_ = OVERAPPROXIMATION; |
+ request_type_ = FINALIZATION; |
if (action == GC_VIA_STACK_GUARD) { |
heap_->isolate()->stack_guard()->RequestGC(); |
} |
@@ -893,8 +919,8 @@ void IncrementalMarking::MarkingComplete(CompletionAction action) { |
void IncrementalMarking::Epilogue() { |
was_activated_ = false; |
- weak_closure_was_overapproximated_ = false; |
- weak_closure_approximation_rounds_ = 0; |
+ finalize_marking_completed_ = false; |
+ incremental_marking_finalization_rounds_ = 0; |
} |
@@ -1072,9 +1098,9 @@ intptr_t IncrementalMarking::Step(intptr_t allocated_bytes, |
if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) { |
if (completion == FORCE_COMPLETION || |
IsIdleMarkingDelayCounterLimitReached()) { |
- if (FLAG_overapproximate_weak_closure && |
- !weak_closure_was_overapproximated_) { |
- OverApproximateWeakClosure(action); |
+ if (FLAG_finalize_marking_incrementally && |
+ !finalize_marking_completed_) { |
+ FinalizeMarking(action); |
} else { |
MarkingComplete(action); |
} |