5 #include "src/heap/gc-idle-time-handler.h" 8 #include "src/heap/gc-tracer.h" 14 const double GCIdleTimeHandler::kConservativeTimeRatio = 0.9;
15 const size_t GCIdleTimeHandler::kMaxFinalIncrementalMarkCompactTimeInMs = 1000;
16 const double GCIdleTimeHandler::kHighContextDisposalRate = 100;
17 const size_t GCIdleTimeHandler::kMinTimeForOverApproximatingWeakClosureInMs = 1;
20 void GCIdleTimeAction::Print() {
28 case DO_INCREMENTAL_STEP:
29 PrintF(
"incremental step");
30 if (additional_work) {
31 PrintF(
"; finalized marking");
41 void GCIdleTimeHeapState::Print() {
42 PrintF(
"contexts_disposed=%d ", contexts_disposed);
43 PrintF(
"contexts_disposal_rate=%f ", contexts_disposal_rate);
44 PrintF(
"size_of_objects=%" PRIuS
" ", size_of_objects);
45 PrintF(
"incremental_marking_stopped=%d ", incremental_marking_stopped);
48 size_t GCIdleTimeHandler::EstimateMarkingStepSize(
49 double idle_time_in_ms,
double marking_speed_in_bytes_per_ms) {
50 DCHECK_LT(0, idle_time_in_ms);
52 if (marking_speed_in_bytes_per_ms == 0) {
53 marking_speed_in_bytes_per_ms = kInitialConservativeMarkingSpeed;
56 double marking_step_size = marking_speed_in_bytes_per_ms * idle_time_in_ms;
57 if (marking_step_size >= kMaximumMarkingStepSize) {
58 return kMaximumMarkingStepSize;
60 return static_cast<size_t>(marking_step_size * kConservativeTimeRatio);
63 double GCIdleTimeHandler::EstimateFinalIncrementalMarkCompactTime(
64 size_t size_of_objects,
65 double final_incremental_mark_compact_speed_in_bytes_per_ms) {
66 if (final_incremental_mark_compact_speed_in_bytes_per_ms == 0) {
67 final_incremental_mark_compact_speed_in_bytes_per_ms =
68 kInitialConservativeFinalIncrementalMarkCompactSpeed;
71 size_of_objects / final_incremental_mark_compact_speed_in_bytes_per_ms;
72 return Min<double>(result, kMaxFinalIncrementalMarkCompactTimeInMs);
75 bool GCIdleTimeHandler::ShouldDoContextDisposalMarkCompact(
76 int contexts_disposed,
double contexts_disposal_rate,
77 size_t size_of_objects) {
78 return contexts_disposed > 0 && contexts_disposal_rate > 0 &&
79 contexts_disposal_rate < kHighContextDisposalRate &&
80 size_of_objects <= kMaxHeapSizeForContextDisposalMarkCompact;
83 bool GCIdleTimeHandler::ShouldDoFinalIncrementalMarkCompact(
84 double idle_time_in_ms,
size_t size_of_objects,
85 double final_incremental_mark_compact_speed_in_bytes_per_ms) {
86 return idle_time_in_ms >=
87 EstimateFinalIncrementalMarkCompactTime(
89 final_incremental_mark_compact_speed_in_bytes_per_ms);
92 bool GCIdleTimeHandler::ShouldDoOverApproximateWeakClosure(
93 double idle_time_in_ms) {
95 return idle_time_in_ms >= kMinTimeForOverApproximatingWeakClosureInMs;
99 GCIdleTimeAction GCIdleTimeHandler::NothingOrDone(
double idle_time_in_ms) {
100 if (idle_time_in_ms >= kMinBackgroundIdleTime) {
101 return GCIdleTimeAction::Nothing();
103 if (idle_times_which_made_no_progress_ >= kMaxNoProgressIdleTimes) {
104 return GCIdleTimeAction::Done();
106 idle_times_which_made_no_progress_++;
107 return GCIdleTimeAction::Nothing();
124 GCIdleTimeAction GCIdleTimeHandler::Compute(
double idle_time_in_ms,
125 GCIdleTimeHeapState heap_state) {
126 if (static_cast<int>(idle_time_in_ms) <= 0) {
127 if (heap_state.incremental_marking_stopped) {
128 if (ShouldDoContextDisposalMarkCompact(heap_state.contexts_disposed,
129 heap_state.contexts_disposal_rate,
130 heap_state.size_of_objects)) {
131 return GCIdleTimeAction::FullGC();
134 return GCIdleTimeAction::Nothing();
139 if (ShouldDoContextDisposalMarkCompact(heap_state.contexts_disposed,
140 heap_state.contexts_disposal_rate,
141 heap_state.size_of_objects)) {
142 return NothingOrDone(idle_time_in_ms);
145 if (!FLAG_incremental_marking || heap_state.incremental_marking_stopped) {
146 return GCIdleTimeAction::Done();
149 return GCIdleTimeAction::IncrementalStep();
152 bool GCIdleTimeHandler::Enabled() {
return FLAG_incremental_marking; }