OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_GC_IDLE_TIME_HANDLER_H_ | 5 #ifndef V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
6 #define V8_HEAP_GC_IDLE_TIME_HANDLER_H_ | 6 #define V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
7 | 7 |
8 #include "src/globals.h" | 8 #include "src/globals.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 | 144 |
145 // Incremental marking step time. | 145 // Incremental marking step time. |
146 static const size_t kIncrementalMarkingStepTimeInMs = 1; | 146 static const size_t kIncrementalMarkingStepTimeInMs = 1; |
147 | 147 |
148 static const size_t kMinTimeForOverApproximatingWeakClosureInMs; | 148 static const size_t kMinTimeForOverApproximatingWeakClosureInMs; |
149 | 149 |
150 // The number of idle MarkCompact GCs to perform before transitioning to | 150 // The number of idle MarkCompact GCs to perform before transitioning to |
151 // the kDone mode. | 151 // the kDone mode. |
152 static const int kMaxIdleMarkCompacts = 3; | 152 static const int kMaxIdleMarkCompacts = 3; |
153 | 153 |
154 // The number of mutator GCs before transitioning to the kReduceLatency mode. | 154 // The number of mutator MarkCompact GCs before transitioning to the |
155 static const int kGCsBeforeMutatorIsActive = 7; | 155 // kReduceLatency mode. |
| 156 static const int kMarkCompactsBeforeMutatorIsActive = 1; |
156 | 157 |
157 // Mutator is considered idle if | 158 // Mutator is considered idle if |
158 // 1) there is an idle notification with time >= kLargeLongIdleTime, | 159 // 1) there are N idle notification with time >= kMinBackgroundIdleTime, |
159 // 2) or there are kLongIdleNotificationsBeforeMutatorIsIdle idle | 160 // 2) or there are M idle notifications with time >= kMinLongIdleTime |
160 // notifications | 161 // without any mutator GC in between. |
161 // with time >= kMinLongIdleTime and without any mutator GC in between. | 162 // Where N = kBackgroundIdleNotificationsBeforeMutatorIsIdle, |
| 163 // M = kLongIdleNotificationsBeforeMutatorIsIdle |
162 static const int kMinLongIdleTime = kMaxFrameRenderingIdleTime + 1; | 164 static const int kMinLongIdleTime = kMaxFrameRenderingIdleTime + 1; |
163 static const int kLargeLongIdleTime = 900; | 165 static const int kMinBackgroundIdleTime = 900; |
164 static const int kLongIdleNotificationsBeforeMutatorIsIdle = 600; | 166 static const int kBackgroundIdleNotificationsBeforeMutatorIsIdle = 2; |
165 | 167 static const int kLongIdleNotificationsBeforeMutatorIsIdle = 50; |
| 168 // Number of times we will return a Nothing action in the current mode |
| 169 // despite having idle time available before we returning a Done action to |
| 170 // ensure we don't keep scheduling idle tasks and making no progress. |
| 171 static const int kMaxNoProgressIdleTimesPerMode = 10; |
166 | 172 |
167 class HeapState { | 173 class HeapState { |
168 public: | 174 public: |
169 void Print(); | 175 void Print(); |
170 | 176 |
171 int contexts_disposed; | 177 int contexts_disposed; |
172 double contexts_disposal_rate; | 178 double contexts_disposal_rate; |
173 size_t size_of_objects; | 179 size_t size_of_objects; |
174 bool incremental_marking_stopped; | 180 bool incremental_marking_stopped; |
175 bool can_start_incremental_marking; | 181 bool can_start_incremental_marking; |
176 bool sweeping_in_progress; | 182 bool sweeping_in_progress; |
177 bool sweeping_completed; | 183 bool sweeping_completed; |
178 size_t mark_compact_speed_in_bytes_per_ms; | 184 size_t mark_compact_speed_in_bytes_per_ms; |
179 size_t incremental_marking_speed_in_bytes_per_ms; | 185 size_t incremental_marking_speed_in_bytes_per_ms; |
180 size_t final_incremental_mark_compact_speed_in_bytes_per_ms; | 186 size_t final_incremental_mark_compact_speed_in_bytes_per_ms; |
181 size_t scavenge_speed_in_bytes_per_ms; | 187 size_t scavenge_speed_in_bytes_per_ms; |
182 size_t used_new_space_size; | 188 size_t used_new_space_size; |
183 size_t new_space_capacity; | 189 size_t new_space_capacity; |
184 size_t new_space_allocation_throughput_in_bytes_per_ms; | 190 size_t new_space_allocation_throughput_in_bytes_per_ms; |
185 }; | 191 }; |
186 | 192 |
187 GCIdleTimeHandler() | 193 GCIdleTimeHandler() |
188 : idle_mark_compacts_(0), | 194 : idle_mark_compacts_(0), |
189 mark_compacts_(0), | 195 mark_compacts_(0), |
190 scavenges_(0), | 196 scavenges_(0), |
191 long_idle_notifications_(0), | 197 long_idle_notifications_(0), |
| 198 background_idle_notifications_(0), |
| 199 idle_times_which_made_no_progress_per_mode_(0), |
192 mode_(kReduceLatency) {} | 200 mode_(kReduceLatency) {} |
193 | 201 |
194 GCIdleTimeAction Compute(double idle_time_in_ms, HeapState heap_state); | 202 GCIdleTimeAction Compute(double idle_time_in_ms, HeapState heap_state); |
195 | 203 |
196 void NotifyIdleMarkCompact() { ++idle_mark_compacts_; } | 204 void NotifyIdleMarkCompact() { ++idle_mark_compacts_; } |
197 | 205 |
198 void NotifyMarkCompact() { ++mark_compacts_; } | 206 void NotifyMarkCompact() { ++mark_compacts_; } |
199 | 207 |
200 void NotifyScavenge() { ++scavenges_; } | 208 void NotifyScavenge() { ++scavenges_; } |
201 | 209 |
(...skipping 23 matching lines...) Expand all Loading... |
225 size_t idle_time_in_ms, size_t new_space_size, size_t used_new_space_size, | 233 size_t idle_time_in_ms, size_t new_space_size, size_t used_new_space_size, |
226 size_t scavenger_speed_in_bytes_per_ms, | 234 size_t scavenger_speed_in_bytes_per_ms, |
227 size_t new_space_allocation_throughput_in_bytes_per_ms); | 235 size_t new_space_allocation_throughput_in_bytes_per_ms); |
228 | 236 |
229 enum Mode { kReduceLatency, kReduceMemory, kDone }; | 237 enum Mode { kReduceLatency, kReduceMemory, kDone }; |
230 | 238 |
231 Mode mode() { return mode_; } | 239 Mode mode() { return mode_; } |
232 | 240 |
233 private: | 241 private: |
234 bool IsMutatorActive(int contexts_disposed, int gcs); | 242 bool IsMutatorActive(int contexts_disposed, int gcs); |
235 bool IsMutatorIdle(int long_idle_notifications, int gcs); | 243 bool IsMutatorIdle(int long_idle_notifications, |
| 244 int background_idle_notifications, int gcs); |
236 void UpdateCounters(double idle_time_in_ms); | 245 void UpdateCounters(double idle_time_in_ms); |
237 void ResetCounters(); | 246 void ResetCounters(); |
238 Mode NextMode(const HeapState& heap_state); | 247 Mode NextMode(const HeapState& heap_state); |
239 GCIdleTimeAction Action(double idle_time_in_ms, const HeapState& heap_state, | 248 GCIdleTimeAction Action(double idle_time_in_ms, const HeapState& heap_state, |
240 bool reduce_memory); | 249 bool reduce_memory); |
| 250 GCIdleTimeAction NothingOrDone(); |
241 | 251 |
242 int idle_mark_compacts_; | 252 int idle_mark_compacts_; |
243 int mark_compacts_; | 253 int mark_compacts_; |
244 int scavenges_; | 254 int scavenges_; |
245 // The number of long idle notifications with no mutator GC happening | 255 // The number of long idle notifications with no GC happening |
246 // between the notifications. | 256 // between the notifications. |
247 int long_idle_notifications_; | 257 int long_idle_notifications_; |
| 258 // The number of background idle notifications with no GC happening |
| 259 // between the notifications. |
| 260 int background_idle_notifications_; |
| 261 // Idle notifications with no progress in the current mode. |
| 262 int idle_times_which_made_no_progress_per_mode_; |
248 | 263 |
249 Mode mode_; | 264 Mode mode_; |
250 | 265 |
251 DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); | 266 DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); |
252 }; | 267 }; |
253 | 268 |
254 } // namespace internal | 269 } // namespace internal |
255 } // namespace v8 | 270 } // namespace v8 |
256 | 271 |
257 #endif // V8_HEAP_GC_IDLE_TIME_HANDLER_H_ | 272 #endif // V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
OLD | NEW |