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) { |