diff options
Diffstat (limited to 'deps/v8/src/heap/memory-reducer.cc')
-rw-r--r-- | deps/v8/src/heap/memory-reducer.cc | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/deps/v8/src/heap/memory-reducer.cc b/deps/v8/src/heap/memory-reducer.cc index 2aed4c714a..3645547ef5 100644 --- a/deps/v8/src/heap/memory-reducer.cc +++ b/deps/v8/src/heap/memory-reducer.cc @@ -17,6 +17,8 @@ const int MemoryReducer::kLongDelayMs = 8000; const int MemoryReducer::kShortDelayMs = 500; const int MemoryReducer::kWatchdogDelayMs = 100000; const int MemoryReducer::kMaxNumberOfGCs = 3; +const double MemoryReducer::kCommittedMemoryFactor = 1.1; +const size_t MemoryReducer::kCommittedMemoryDelta = 10 * MB; MemoryReducer::TimerTask::TimerTask(MemoryReducer* memory_reducer) : CancelableTask(memory_reducer->heap()->isolate()), @@ -47,6 +49,7 @@ void MemoryReducer::TimerTask::RunInternal() { event.can_start_incremental_gc = heap->incremental_marking()->IsStopped() && (heap->incremental_marking()->CanBeActivated() || optimize_for_memory); + event.committed_memory = heap->CommittedOldGenerationMemory(); memory_reducer_->NotifyTimer(event); } @@ -128,17 +131,30 @@ bool MemoryReducer::WatchdogGC(const State& state, const Event& event) { MemoryReducer::State MemoryReducer::Step(const State& state, const Event& event) { if (!FLAG_incremental_marking || !FLAG_memory_reducer) { - return State(kDone, 0, 0, state.last_gc_time_ms); + return State(kDone, 0, 0, state.last_gc_time_ms, 0); } switch (state.action) { case kDone: if (event.type == kTimer) { return state; + } else if (event.type == kMarkCompact) { + if (event.committed_memory < + Max(static_cast<size_t>(state.committed_memory_at_last_run * + kCommittedMemoryFactor), + state.committed_memory_at_last_run + kCommittedMemoryDelta)) { + return state; + } else { + return State(kWait, 0, event.time_ms + kLongDelayMs, + event.type == kMarkCompact ? event.time_ms + : state.last_gc_time_ms, + 0); + } } else { - DCHECK(event.type == kPossibleGarbage || event.type == kMarkCompact); + DCHECK_EQ(kPossibleGarbage, event.type); return State( kWait, 0, event.time_ms + kLongDelayMs, - event.type == kMarkCompact ? event.time_ms : state.last_gc_time_ms); + event.type == kMarkCompact ? event.time_ms : state.last_gc_time_ms, + 0); } case kWait: switch (event.type) { @@ -146,23 +162,24 @@ MemoryReducer::State MemoryReducer::Step(const State& state, return state; case kTimer: if (state.started_gcs >= kMaxNumberOfGCs) { - return State(kDone, kMaxNumberOfGCs, 0.0, state.last_gc_time_ms); + return State(kDone, kMaxNumberOfGCs, 0.0, state.last_gc_time_ms, + event.committed_memory); } else if (event.can_start_incremental_gc && (event.should_start_incremental_gc || WatchdogGC(state, event))) { if (state.next_gc_start_ms <= event.time_ms) { return State(kRun, state.started_gcs + 1, 0.0, - state.last_gc_time_ms); + state.last_gc_time_ms, 0); } else { return state; } } else { return State(kWait, state.started_gcs, event.time_ms + kLongDelayMs, - state.last_gc_time_ms); + state.last_gc_time_ms, 0); } case kMarkCompact: return State(kWait, state.started_gcs, event.time_ms + kLongDelayMs, - event.time_ms); + event.time_ms, 0); } case kRun: if (event.type != kMarkCompact) { @@ -171,14 +188,15 @@ MemoryReducer::State MemoryReducer::Step(const State& state, if (state.started_gcs < kMaxNumberOfGCs && (event.next_gc_likely_to_collect_more || state.started_gcs == 1)) { return State(kWait, state.started_gcs, event.time_ms + kShortDelayMs, - event.time_ms); + event.time_ms, 0); } else { - return State(kDone, kMaxNumberOfGCs, 0.0, event.time_ms); + return State(kDone, kMaxNumberOfGCs, 0.0, event.time_ms, + event.committed_memory); } } } UNREACHABLE(); - return State(kDone, 0, 0, 0.0); // Make the compiler happy. + return State(kDone, 0, 0, 0.0, 0); // Make the compiler happy. } @@ -192,7 +210,7 @@ void MemoryReducer::ScheduleTimer(double time_ms, double delay_ms) { isolate, timer_task, (delay_ms + kSlackMs) / 1000.0); } -void MemoryReducer::TearDown() { state_ = State(kDone, 0, 0, 0.0); } +void MemoryReducer::TearDown() { state_ = State(kDone, 0, 0, 0.0, 0); } } // namespace internal } // namespace v8 |