PrintF("no action");
break;
case DO_INCREMENTAL_MARKING:
- PrintF("incremental marking with step %" V8_PTR_PREFIX "d", parameter);
+ PrintF("incremental marking with step %" V8_PTR_PREFIX "d / ms",
+ parameter);
break;
case DO_SCAVENGE:
PrintF("scavenge");
return GCIdleTimeAction::Nothing();
}
size_t step_size = EstimateMarkingStepSize(
- static_cast<size_t>(idle_time_in_ms),
+ static_cast<size_t>(kIncrementalMarkingStepTimeInMs),
heap_state.incremental_marking_speed_in_bytes_per_ms);
return GCIdleTimeAction::IncrementalMarking(step_size);
}
if (incremental_marking()->IsStopped()) {
incremental_marking()->Start();
}
- incremental_marking()->Step(action.parameter,
- IncrementalMarking::NO_GC_VIA_STACK_GUARD,
- IncrementalMarking::FORCE_MARKING,
- IncrementalMarking::DO_NOT_FORCE_COMPLETION);
- double remaining_idle_time_in_ms =
- deadline_in_ms - MonotonicallyIncreasingTimeInMs();
+ double remaining_idle_time_in_ms = 0.0;
+ do {
+ incremental_marking()->Step(
+ action.parameter, IncrementalMarking::NO_GC_VIA_STACK_GUARD,
+ IncrementalMarking::FORCE_MARKING,
+ IncrementalMarking::DO_NOT_FORCE_COMPLETION);
+ remaining_idle_time_in_ms =
+ deadline_in_ms - MonotonicallyIncreasingTimeInMs();
+ } while (remaining_idle_time_in_ms >=
+ 2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs &&
+ !incremental_marking()->IsComplete() &&
+ !mark_compact_collector_.marking_deque()->IsEmpty());
if (remaining_idle_time_in_ms > 0.0) {
TryFinalizeIdleIncrementalMarking(
remaining_idle_time_in_ms, heap_state.size_of_objects,