OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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_memory_reducer_H | 5 #ifndef V8_HEAP_memory_reducer_H |
6 #define V8_HEAP_memory_reducer_H | 6 #define V8_HEAP_memory_reducer_H |
7 | 7 |
8 #include "include/v8-platform.h" | 8 #include "include/v8-platform.h" |
9 #include "src/base/macros.h" | 9 #include "src/base/macros.h" |
10 | 10 |
(...skipping 30 matching lines...) Expand all Loading... |
41 // DONE -> WAIT 0 (now_ms + long_delay_ms) happens: | 41 // DONE -> WAIT 0 (now_ms + long_delay_ms) happens: |
42 // - on context disposal, | 42 // - on context disposal, |
43 // - at the end of mark-compact GC initiated by the mutator. | 43 // - at the end of mark-compact GC initiated by the mutator. |
44 // This signals that there is potential garbage to be collected. | 44 // This signals that there is potential garbage to be collected. |
45 // | 45 // |
46 // WAIT n x -> WAIT n (now_ms + long_delay_ms) happens: | 46 // WAIT n x -> WAIT n (now_ms + long_delay_ms) happens: |
47 // - on mark-compact GC initiated by the mutator, | 47 // - on mark-compact GC initiated by the mutator, |
48 // - in the timer callback if the mutator allocation rate is high or | 48 // - in the timer callback if the mutator allocation rate is high or |
49 // incremental GC is in progress. | 49 // incremental GC is in progress. |
50 // | 50 // |
| 51 // WAIT n x -> WAIT (n+1) happens: |
| 52 // - on background idle notification, which signals that we can start |
| 53 // incremental marking even if the allocation rate is high. |
| 54 // The MemoryReducer starts incremental marking on this transition but still |
| 55 // has a pending timer task. |
| 56 // |
| 57 // WAIT n x -> DONE happens: |
| 58 // - in the timer callback if n >= kMaxNumberOfGCs. |
| 59 // |
51 // WAIT n x -> RUN (n+1) happens: | 60 // WAIT n x -> RUN (n+1) happens: |
52 // - in the timer callback if the mutator allocation rate is low | 61 // - in the timer callback if the mutator allocation rate is low |
53 // and now_ms >= x and there is no incremental GC in progress. | 62 // and now_ms >= x and there is no incremental GC in progress. |
54 // The MemoryReducer starts incremental marking on this transition. | 63 // The MemoryReducer starts incremental marking on this transition. |
55 // | 64 // |
56 // RUN n -> DONE happens: | 65 // RUN n -> DONE happens: |
57 // - at end of the incremental GC initiated by the MemoryReducer if | 66 // - at end of the incremental GC initiated by the MemoryReducer if |
58 // (n > 1 and there is no more garbage to be collected) or | 67 // (n > 1 and there is no more garbage to be collected) or |
59 // n == kMaxNumberOfGCs. | 68 // n == kMaxNumberOfGCs. |
60 // RUN n -> WAIT n (now_ms + short_delay_ms) happens: | 69 // RUN n -> WAIT n (now_ms + short_delay_ms) happens: |
(...skipping 13 matching lines...) Expand all Loading... |
74 next_gc_start_ms(next_gc_start_ms) {} | 83 next_gc_start_ms(next_gc_start_ms) {} |
75 Action action; | 84 Action action; |
76 int started_gcs; | 85 int started_gcs; |
77 double next_gc_start_ms; | 86 double next_gc_start_ms; |
78 }; | 87 }; |
79 | 88 |
80 enum EventType { | 89 enum EventType { |
81 kTimer, | 90 kTimer, |
82 kMarkCompact, | 91 kMarkCompact, |
83 kContextDisposed, | 92 kContextDisposed, |
| 93 kBackgroundIdleNotification |
84 }; | 94 }; |
85 | 95 |
86 struct Event { | 96 struct Event { |
87 EventType type; | 97 EventType type; |
88 double time_ms; | 98 double time_ms; |
89 bool low_allocation_rate; | 99 bool low_allocation_rate; |
90 bool next_gc_likely_to_collect_more; | 100 bool next_gc_likely_to_collect_more; |
91 bool can_start_incremental_gc; | 101 bool can_start_incremental_gc; |
92 }; | 102 }; |
93 | 103 |
94 explicit MemoryReducer(Heap* heap) : heap_(heap), state_(kDone, 0, 0.0) {} | 104 explicit MemoryReducer(Heap* heap) : heap_(heap), state_(kDone, 0, 0.0) {} |
95 // Callbacks. | 105 // Callbacks. |
96 void NotifyTimer(const Event& event); | 106 void NotifyTimer(const Event& event); |
97 void NotifyMarkCompact(const Event& event); | 107 void NotifyMarkCompact(const Event& event); |
98 void NotifyScavenge(const Event& event); | |
99 void NotifyContextDisposed(const Event& event); | 108 void NotifyContextDisposed(const Event& event); |
| 109 void NotifyBackgroundIdleNotification(const Event& event); |
100 // The step function that computes the next state from the current state and | 110 // The step function that computes the next state from the current state and |
101 // the incoming event. | 111 // the incoming event. |
102 static State Step(const State& state, const Event& event); | 112 static State Step(const State& state, const Event& event); |
103 // Posts a timer task that will call NotifyTimer after the given delay. | 113 // Posts a timer task that will call NotifyTimer after the given delay. |
104 void ScheduleTimer(double delay_ms); | 114 void ScheduleTimer(double delay_ms); |
105 | 115 |
106 static const int kLongDelayMs; | 116 static const int kLongDelayMs; |
107 static const int kShortDelayMs; | 117 static const int kShortDelayMs; |
108 static const int kMaxNumberOfGCs; | 118 static const int kMaxNumberOfGCs; |
109 | 119 |
(...skipping 16 matching lines...) Expand all Loading... |
126 Heap* heap_; | 136 Heap* heap_; |
127 State state_; | 137 State state_; |
128 | 138 |
129 DISALLOW_COPY_AND_ASSIGN(MemoryReducer); | 139 DISALLOW_COPY_AND_ASSIGN(MemoryReducer); |
130 }; | 140 }; |
131 | 141 |
132 } // namespace internal | 142 } // namespace internal |
133 } // namespace v8 | 143 } // namespace v8 |
134 | 144 |
135 #endif // V8_HEAP_memory_reducer_H | 145 #endif // V8_HEAP_memory_reducer_H |
OLD | NEW |