| Index: src/heap/memory-reducer.cc
|
| diff --git a/src/heap/memory-reducer.cc b/src/heap/memory-reducer.cc
|
| index 634c625755dbe611fe103dd270ed3509a6cf4cde..d81d513f56cc0f4e0a38e031c6e4b17cdc508db9 100644
|
| --- a/src/heap/memory-reducer.cc
|
| +++ b/src/heap/memory-reducer.cc
|
| @@ -42,12 +42,35 @@ void MemoryReducer::NotifyTimer(const Event& event) {
|
| if (state_.action == kRun) {
|
| DCHECK(heap()->incremental_marking()->IsStopped());
|
| DCHECK(FLAG_incremental_marking);
|
| - heap()->StartIdleIncrementalMarking();
|
| if (FLAG_trace_gc_verbose) {
|
| PrintIsolate(heap()->isolate(), "Memory reducer: started GC #%d\n",
|
| state_.started_gcs);
|
| }
|
| + if (heap()->ShouldOptimizeForMemoryUsage()) {
|
| + // Do full GC if memory usage has higher priority than latency. This is
|
| + // important for background tabs that do not send idle notifications.
|
| + heap()->CollectAllGarbage(Heap::kReduceMemoryFootprintMask,
|
| + "memory reducer");
|
| + } else {
|
| + heap()->StartIdleIncrementalMarking();
|
| + }
|
| } else if (state_.action == kWait) {
|
| + if (!heap()->incremental_marking()->IsStopped() &&
|
| + heap()->ShouldOptimizeForMemoryUsage()) {
|
| + // Make progress with pending incremental marking if memory usage has
|
| + // higher priority than latency. This is important for background tabs
|
| + // that do not send idle notifications.
|
| + const int kIncrementalMarkingDelayMs = 500;
|
| + double deadline = heap()->MonotonicallyIncreasingTimeInMs() +
|
| + kIncrementalMarkingDelayMs;
|
| + heap()->AdvanceIncrementalMarking(
|
| + 0, deadline, i::IncrementalMarking::StepActions(
|
| + i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
|
| + i::IncrementalMarking::FORCE_MARKING,
|
| + i::IncrementalMarking::FORCE_COMPLETION));
|
| + heap()->FinalizeIncrementalMarkingIfComplete(
|
| + "Memory reducer: finalize incremental marking");
|
| + }
|
| // Re-schedule the timer.
|
| ScheduleTimer(state_.next_gc_start_ms - event.time_ms);
|
| if (FLAG_trace_gc_verbose) {
|
|
|