double mutator_speed,
int freed_global_handles) {
const int kFreedGlobalHandlesThreshold = 700;
- const double kMaxHeapGrowingFactorForManyFreedGlobalHandles = 1.3;
+ const double kConservativeHeapGrowingFactor = 1.3;
double factor = HeapGrowingFactor(gc_speed, mutator_speed);
factor = Min(factor, kMaxHeapGrowingFactorMemoryConstrained);
}
- if (freed_global_handles >= kFreedGlobalHandlesThreshold) {
- factor = Min(factor, kMaxHeapGrowingFactorForManyFreedGlobalHandles);
+ if (freed_global_handles >= kFreedGlobalHandlesThreshold ||
+ memory_reducer_.ShouldGrowHeapSlowly()) {
+ factor = Min(factor, kConservativeHeapGrowingFactor);
}
if (FLAG_stress_compaction ||
return state;
case kTimer:
if (state.started_gcs >= kMaxNumberOfGCs) {
- return State(kDone, 0, 0.0, state.last_gc_time_ms);
+ return State(kDone, kMaxNumberOfGCs, 0.0, state.last_gc_time_ms);
} else if (event.can_start_incremental_gc &&
(event.low_allocation_rate || WatchdogGC(state, event))) {
if (state.next_gc_start_ms <= event.time_ms) {
return State(kWait, state.started_gcs, event.time_ms + kShortDelayMs,
event.time_ms);
} else {
- return State(kDone, 0, 0.0, event.time_ms);
+ return State(kDone, kMaxNumberOfGCs, 0.0, event.time_ms);
}
}
}
state1 = MemoryReducer::Step(state0, TimerEventLowAllocationRate(2000));
EXPECT_EQ(MemoryReducer::kDone, state1.action);
EXPECT_EQ(0, state1.next_gc_start_ms);
- EXPECT_EQ(0, state1.started_gcs);
+ EXPECT_EQ(MemoryReducer::kMaxNumberOfGCs, state1.started_gcs);
EXPECT_EQ(state0.last_gc_time_ms, state1.last_gc_time_ms);
state1 = MemoryReducer::Step(state0, TimerEventHighAllocationRate(2000));
EXPECT_EQ(MemoryReducer::kDone, state1.action);
EXPECT_EQ(0, state1.next_gc_start_ms);
- EXPECT_EQ(0, state1.started_gcs);
+ EXPECT_EQ(MemoryReducer::kMaxNumberOfGCs, state1.started_gcs);
EXPECT_EQ(state0.last_gc_time_ms, state1.last_gc_time_ms);
state1 = MemoryReducer::Step(state0, TimerEventPendingGC(2000));
EXPECT_EQ(MemoryReducer::kDone, state1.action);
EXPECT_EQ(0, state1.next_gc_start_ms);
- EXPECT_EQ(0, state1.started_gcs);
+ EXPECT_EQ(MemoryReducer::kMaxNumberOfGCs, state1.started_gcs);
EXPECT_EQ(state0.last_gc_time_ms, state1.last_gc_time_ms);
}
state1 = MemoryReducer::Step(state0, MarkCompactEventNoGarbageLeft(2000));
EXPECT_EQ(MemoryReducer::kDone, state1.action);
EXPECT_EQ(0, state1.next_gc_start_ms);
- EXPECT_EQ(0, state1.started_gcs);
+ EXPECT_EQ(MemoryReducer::kMaxNumberOfGCs, state1.started_gcs);
EXPECT_EQ(2000, state1.last_gc_time_ms);
state0.started_gcs = MemoryReducer::kMaxNumberOfGCs;