Commit 360a25fc authored by Omer Katz's avatar Omer Katz Committed by Commit Bot

heap: Various marking tweaks

This CL does the following:
1) Move flushing of ephemeron pairs to the start of AdvanceMarking
  (also increase frequency by 2x and make step counters actually
  count steps).
2) Introduce additional (disabled) scopes for diagnostics.
3) Increase frequency of deadline checks when draining worklists (by
   ~8x)
4) Revise worklist draining so that the deadline is checked before
   draining starts.

Bug: 986235
Change-Id: Ie24827a52cbcb497426fd51bc052fb129c417702
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2283743
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Reviewed-by: default avatarMichael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786229}
parent 44b1a751
...@@ -459,7 +459,7 @@ class PLATFORM_EXPORT ThreadHeap { ...@@ -459,7 +459,7 @@ class PLATFORM_EXPORT ThreadHeap {
static ThreadHeap* main_thread_heap_; static ThreadHeap* main_thread_heap_;
static constexpr size_t kStepsBeforeEphemeronPairsFlush = 8u; static constexpr size_t kStepsBeforeEphemeronPairsFlush = 4u;
size_t steps_since_last_ephemeron_pairs_flush_ = 0; size_t steps_since_last_ephemeron_pairs_flush_ = 0;
static constexpr size_t kStepsBeforeEphemeronProcessing = 16u; static constexpr size_t kStepsBeforeEphemeronProcessing = 16u;
size_t steps_since_last_ephemeron_processing_ = 0; size_t steps_since_last_ephemeron_processing_ = 0;
......
...@@ -158,7 +158,7 @@ base::TimeDelta ThreadHeapStatsCollector::Event::incremental_marking_time() ...@@ -158,7 +158,7 @@ base::TimeDelta ThreadHeapStatsCollector::Event::incremental_marking_time()
base::TimeDelta base::TimeDelta
ThreadHeapStatsCollector::Event::worklist_processing_time_foreground() const { ThreadHeapStatsCollector::Event::worklist_processing_time_foreground() const {
return scope_data[kMarkProcessWorklist]; return scope_data[kMarkProcessWorklists];
} }
base::TimeDelta ThreadHeapStatsCollector::Event::atomic_marking_time() const { base::TimeDelta ThreadHeapStatsCollector::Event::atomic_marking_time() const {
......
...@@ -40,31 +40,37 @@ class PLATFORM_EXPORT ThreadHeapStatsObserver { ...@@ -40,31 +40,37 @@ class PLATFORM_EXPORT ThreadHeapStatsObserver {
virtual void DecreaseAllocatedObjectSize(size_t) = 0; virtual void DecreaseAllocatedObjectSize(size_t) = 0;
}; };
#define FOR_ALL_SCOPES(V) \ #define FOR_ALL_SCOPES(V) \
V(AtomicPauseCompaction) \ V(AtomicPauseCompaction) \
V(AtomicPauseMarkEpilogue) \ V(AtomicPauseMarkEpilogue) \
V(AtomicPauseMarkPrologue) \ V(AtomicPauseMarkPrologue) \
V(AtomicPauseMarkRoots) \ V(AtomicPauseMarkRoots) \
V(AtomicPauseMarkTransitiveClosure) \ V(AtomicPauseMarkTransitiveClosure) \
V(AtomicPauseSweepAndCompact) \ V(AtomicPauseSweepAndCompact) \
V(CompleteSweep) \ V(CompleteSweep) \
V(IncrementalMarkingFinalize) \ V(IncrementalMarkingFinalize) \
V(IncrementalMarkingStartMarking) \ V(IncrementalMarkingStartMarking) \
V(IncrementalMarkingStep) \ V(IncrementalMarkingStep) \
V(InvokePreFinalizers) \ V(IncrementalMarkingWithDeadline) \
V(LazySweepInIdle) \ V(InvokePreFinalizers) \
V(LazySweepOnAllocation) \ V(LazySweepInIdle) \
V(MarkBailOutObjects) \ V(LazySweepOnAllocation) \
V(MarkInvokeEphemeronCallbacks) \ V(MarkBailOutObjects) \
V(MarkProcessWorklist) \ V(MarkInvokeEphemeronCallbacks) \
V(MarkNotFullyConstructedObjects) \ V(MarkFlushV8References) \
V(MarkWeakProcessing) \ V(MarkFlushEphemeronPairs) \
V(UnifiedMarkingStep) \ V(MarkProcessWorklists) \
V(VisitCrossThreadPersistents) \ V(MarkProcessMarkingWorklist) \
V(VisitPersistentRoots) \ V(MarkProcessWriteBarrierWorklist) \
V(VisitPersistents) \ V(MarkProcessNotFullyconstructeddWorklist) \
V(VisitRoots) \ V(MarkNotFullyConstructedObjects) \
V(VisitStackRoots) \ V(MarkWeakProcessing) \
V(UnifiedMarkingStep) \
V(VisitCrossThreadPersistents) \
V(VisitPersistentRoots) \
V(VisitPersistents) \
V(VisitRoots) \
V(VisitStackRoots) \
V(VisitRememberedSets) V(VisitRememberedSets)
#define FOR_ALL_CONCURRENT_SCOPES(V) \ #define FOR_ALL_CONCURRENT_SCOPES(V) \
......
...@@ -1180,7 +1180,6 @@ void ThreadState::IncrementalMarkingStep(BlinkGC::StackState stack_state) { ...@@ -1180,7 +1180,6 @@ void ThreadState::IncrementalMarkingStep(BlinkGC::StackState stack_state) {
skip_incremental_marking_for_testing_ = false; skip_incremental_marking_for_testing_ = false;
} else { } else {
complete = MarkPhaseAdvanceMarking( complete = MarkPhaseAdvanceMarking(
base::TimeTicks::Now() +
marking_scheduling_->GetNextIncrementalStepDurationForTask( marking_scheduling_->GetNextIncrementalStepDurationForTask(
Heap().stats_collector()->object_size_in_bytes()), Heap().stats_collector()->object_size_in_bytes()),
EphemeronProcessing::kPartialProcessing); EphemeronProcessing::kPartialProcessing);
...@@ -1345,7 +1344,8 @@ void ThreadState::AtomicPauseMarkTransitiveClosure() { ...@@ -1345,7 +1344,8 @@ void ThreadState::AtomicPauseMarkTransitiveClosure() {
Heap().stats_collector(), Heap().stats_collector(),
ThreadHeapStatsCollector::kAtomicPauseMarkTransitiveClosure, "epoch", ThreadHeapStatsCollector::kAtomicPauseMarkTransitiveClosure, "epoch",
gc_age_, "forced", IsForcedGC(current_gc_data_.reason)); gc_age_, "forced", IsForcedGC(current_gc_data_.reason));
CHECK(MarkPhaseAdvanceMarking(base::TimeTicks::Max(), // base::TimeTicks::Now() + base::TimeDelta::Max() == base::TimeTicks::Max()
CHECK(MarkPhaseAdvanceMarking(base::TimeDelta::Max(),
EphemeronProcessing::kFullProcessing)); EphemeronProcessing::kFullProcessing));
} }
...@@ -1588,20 +1588,23 @@ bool ThreadState::MarkPhaseAdvanceMarkingBasedOnSchedule( ...@@ -1588,20 +1588,23 @@ bool ThreadState::MarkPhaseAdvanceMarkingBasedOnSchedule(
base::TimeDelta max_deadline, base::TimeDelta max_deadline,
EphemeronProcessing ephemeron_processing) { EphemeronProcessing ephemeron_processing) {
return MarkPhaseAdvanceMarking( return MarkPhaseAdvanceMarking(
base::TimeTicks::Now() + std::min(max_deadline,
std::min(max_deadline, marking_scheduling_->GetNextIncrementalStepDurationForTask(
marking_scheduling_->GetNextIncrementalStepDurationForTask( Heap().stats_collector()->object_size_in_bytes())),
Heap().stats_collector()->object_size_in_bytes())),
ephemeron_processing); ephemeron_processing);
} }
bool ThreadState::MarkPhaseAdvanceMarking( bool ThreadState::MarkPhaseAdvanceMarking(
base::TimeTicks deadline, base::TimeDelta deadline,
EphemeronProcessing ephemeron_processing) { EphemeronProcessing ephemeron_processing) {
MarkingVisitor* visitor = current_gc_data_.visitor.get(); MarkingVisitor* visitor = current_gc_data_.visitor.get();
const bool finished = ThreadHeapStatsCollector::Scope deadline_scope(
Heap().AdvanceMarking(reinterpret_cast<MarkingVisitor*>(visitor), Heap().stats_collector(),
deadline, ephemeron_processing); ThreadHeapStatsCollector::kIncrementalMarkingWithDeadline, "deadline_ms",
deadline.InMillisecondsF());
const bool finished = Heap().AdvanceMarking(
reinterpret_cast<MarkingVisitor*>(visitor),
base::TimeTicks::Now() + deadline, ephemeron_processing);
// visitor->marked_bytes() can also include bytes marked during roots // visitor->marked_bytes() can also include bytes marked during roots
// visitation which is not counted in worklist_processing_time_foreground. // visitation which is not counted in worklist_processing_time_foreground.
// Since the size of the roots is usually small relative to the size of // Since the size of the roots is usually small relative to the size of
......
...@@ -516,7 +516,7 @@ class PLATFORM_EXPORT ThreadState final { ...@@ -516,7 +516,7 @@ class PLATFORM_EXPORT ThreadState final {
void MarkPhaseVisitNotFullyConstructedObjects(); void MarkPhaseVisitNotFullyConstructedObjects();
bool MarkPhaseAdvanceMarkingBasedOnSchedule(base::TimeDelta, bool MarkPhaseAdvanceMarkingBasedOnSchedule(base::TimeDelta,
EphemeronProcessing); EphemeronProcessing);
bool MarkPhaseAdvanceMarking(base::TimeTicks, EphemeronProcessing); bool MarkPhaseAdvanceMarking(base::TimeDelta, EphemeronProcessing);
void VerifyMarking(BlinkGC::MarkingType); void VerifyMarking(BlinkGC::MarkingType);
// Visit the stack after pushing registers onto the stack. // Visit the stack after pushing registers onto the stack.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment