Chromium Code Reviews| 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 { |
| 11 namespace internal { | 11 namespace internal { |
| 12 | 12 |
| 13 enum GCIdleTimeActionType { | |
| 14 DO_NOTHING, | |
| 15 DO_INCREMENTAL_MARKING, | |
| 16 DO_SCAVENGE, | |
| 17 DO_FULL_GC | |
| 18 }; | |
| 19 | |
| 20 | |
| 21 struct GCIdleTimeAction { | |
|
Hannes Payer (out of office)
2014/08/20 18:24:11
According to the style guide, this should be a cla
ulan
2014/08/21 08:45:19
Done.
| |
| 22 static GCIdleTimeAction Nothing() { | |
| 23 GCIdleTimeAction result; | |
| 24 result.type = DO_NOTHING; | |
| 25 result.parameter = 0; | |
| 26 return result; | |
| 27 } | |
| 28 static GCIdleTimeAction IncrementalMarking(intptr_t step_size) { | |
| 29 GCIdleTimeAction result; | |
| 30 result.type = DO_INCREMENTAL_MARKING; | |
| 31 result.parameter = step_size; | |
| 32 return result; | |
| 33 } | |
| 34 static GCIdleTimeAction Scavenge() { | |
| 35 GCIdleTimeAction result; | |
| 36 result.type = DO_SCAVENGE; | |
| 37 result.parameter = 0; | |
| 38 return result; | |
| 39 } | |
| 40 static GCIdleTimeAction FullGC() { | |
| 41 GCIdleTimeAction result; | |
| 42 result.type = DO_FULL_GC; | |
| 43 result.parameter = 0; | |
| 44 return result; | |
| 45 } | |
| 46 | |
| 47 GCIdleTimeActionType type; | |
| 48 intptr_t parameter; | |
| 49 }; | |
| 50 | |
| 51 class GCTracer; | |
| 52 | |
| 13 // The idle time handler makes decisions about which garbage collection | 53 // The idle time handler makes decisions about which garbage collection |
| 14 // operations are executing during IdleNotification. | 54 // operations are executing during IdleNotification. |
| 15 class GCIdleTimeHandler { | 55 class GCIdleTimeHandler { |
| 16 public: | 56 public: |
| 17 static intptr_t EstimateMarkingStepSize( | |
| 18 int idle_time_in_ms, intptr_t marking_speed_in_bytes_per_ms); | |
| 19 | |
| 20 // If we haven't recorded any incremental marking events yet, we carefully | 57 // If we haven't recorded any incremental marking events yet, we carefully |
| 21 // mark with a conservative lower bound for the marking speed. | 58 // mark with a conservative lower bound for the marking speed. |
| 22 static const intptr_t kInitialConservativeMarkingSpeed = 100 * KB; | 59 static const intptr_t kInitialConservativeMarkingSpeed = 100 * KB; |
| 23 | 60 |
| 24 // We have to make sure that we finish the IdleNotification before | 61 // We have to make sure that we finish the IdleNotification before |
| 25 // idle_time_in_ms. Hence, we conservatively prune our workload estimate. | 62 // idle_time_in_ms. Hence, we conservatively prune our workload estimate. |
| 26 static const double kConservativeTimeRatio; | 63 static const double kConservativeTimeRatio; |
| 27 | 64 |
| 65 GCIdleTimeHandler() | |
| 66 : mark_sweeps_since_idle_round_started_(0), | |
| 67 scavenges_since_last_idle_round_(0) {} | |
| 68 | |
| 69 GCIdleTimeAction Compute(int idle_time_in_ms, int contexts_disposed, | |
| 70 intptr_t size_of_objects, | |
| 71 bool incremental_marking_stopped, | |
| 72 GCTracer* gc_tracer); | |
| 73 | |
| 74 void NotifyIdleFullGC() { | |
|
Hannes Payer (out of office)
2014/08/20 18:24:11
In the gc tracer we refer to the event as mark com
ulan
2014/08/21 08:45:19
Done.
| |
| 75 if (mark_sweeps_since_idle_round_started_ < kMaxMarkSweepsInIdleRound) { | |
| 76 ++mark_sweeps_since_idle_round_started_; | |
| 77 if (mark_sweeps_since_idle_round_started_ == kMaxMarkSweepsInIdleRound) { | |
| 78 scavenges_since_last_idle_round_ = 0; | |
| 79 } | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 void NotifyScavenge() { ++scavenges_since_last_idle_round_; } | |
| 84 | |
| 85 static intptr_t EstimateMarkingStepSize( | |
| 86 int idle_time_in_ms, intptr_t mark_sweep_speed_in_bytes_per_ms); | |
| 87 | |
| 88 static int EstimateMarkSweepTime(intptr_t size_of_objects, | |
| 89 intptr_t mark_sweep_speed_in_bytes_per_ms); | |
| 90 | |
| 28 private: | 91 private: |
| 92 void StartIdleRound() { mark_sweeps_since_idle_round_started_ = 0; } | |
| 93 bool IsIdleRoundFinished() { | |
| 94 return mark_sweeps_since_idle_round_started_ == kMaxMarkSweepsInIdleRound; | |
| 95 } | |
| 96 bool EnoughGarbageSinceLastIdleRound() { | |
| 97 return scavenges_since_last_idle_round_ >= kIdleScavengeThreshold; | |
| 98 } | |
| 99 | |
| 100 static const int kMaxMarkSweepsInIdleRound = 7; | |
|
Hannes Payer (out of office)
2014/08/20 18:24:11
kMaxMarkSweepsInIdleRound -> kMaxMarkCompactsInIdl
ulan
2014/08/21 08:45:19
Done.
| |
| 101 static const int kIdleScavengeThreshold = 5; | |
| 102 int mark_sweeps_since_idle_round_started_; | |
|
Hannes Payer (out of office)
2014/08/20 18:24:11
mark_sweeps_since_idle_round_started_ -> mark_comp
| |
| 103 int scavenges_since_last_idle_round_; | |
| 104 | |
| 29 DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); | 105 DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); |
| 30 }; | 106 }; |
| 31 | 107 |
| 32 } // namespace internal | 108 } // namespace internal |
| 33 } // namespace v8 | 109 } // namespace v8 |
| 34 | 110 |
| 35 #endif // V8_HEAP_GC_IDLE_TIME_HANDLER_H_ | 111 #endif // V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
| OLD | NEW |