OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 void Finalize(); | 88 void Finalize(); |
89 | 89 |
90 void Abort(); | 90 void Abort(); |
91 | 91 |
92 void MarkingComplete(CompletionAction action); | 92 void MarkingComplete(CompletionAction action); |
93 | 93 |
94 // It's hard to know how much work the incremental marker should do to make | 94 // It's hard to know how much work the incremental marker should do to make |
95 // progress in the face of the mutator creating new work for it. We start | 95 // progress in the face of the mutator creating new work for it. We start |
96 // of at a moderate rate of work and gradually increase the speed of the | 96 // of at a moderate rate of work and gradually increase the speed of the |
97 // incremental marker until it completes. | 97 // incremental marker until it completes. |
98 // Do some marking every time this much memory has been allocated. | 98 // Do some marking every time this much memory has been allocated or this many |
99 static const intptr_t kAllocatedThreshold = 65536; | 99 // heavy (color-checking) write barriers have been invoked. |
| 100 static const intptr_t kIncrementalMarkingThreshold = 65536; |
100 // Start off by marking this many times more memory than has been allocated. | 101 // Start off by marking this many times more memory than has been allocated. |
101 static const intptr_t kInitialAllocationMarkingFactor = 1; | 102 static const intptr_t kInitialMarkingSpeed = 1; |
102 // But if we are promoting a lot of data we need to mark faster to keep up | 103 // But if we are promoting a lot of data we need to mark faster to keep up |
103 // with the data that is entering the old space through promotion. | 104 // with the data that is entering the old space through promotion. |
104 static const intptr_t kFastMarking = 3; | 105 static const intptr_t kFastMarking = 3; |
105 // After this many steps we increase the marking/allocating factor. | 106 // After this many steps we increase the marking/allocating factor. |
106 static const intptr_t kAllocationMarkingFactorSpeedupInterval = 1024; | 107 static const intptr_t kMarkingSpeedAccellerationInterval = 1024; |
107 // This is how much we increase the marking/allocating factor by. | 108 // This is how much we increase the marking/allocating factor by. |
108 static const intptr_t kAllocationMarkingFactorSpeedup = 2; | 109 static const intptr_t kMarkingSpeedAccelleration = 2; |
109 static const intptr_t kMaxAllocationMarkingFactor = 1000; | 110 static const intptr_t kMaxMarkingSpeed = 1000; |
110 | 111 |
111 void OldSpaceStep(intptr_t allocated) { | 112 void OldSpaceStep(intptr_t allocated) { |
112 Step(allocated * kFastMarking / kInitialAllocationMarkingFactor, | 113 Step(allocated * kFastMarking / kInitialMarkingSpeed, |
113 GC_VIA_STACK_GUARD); | 114 GC_VIA_STACK_GUARD); |
114 } | 115 } |
115 | 116 |
116 void Step(intptr_t allocated, CompletionAction action); | 117 void Step(intptr_t allocated, CompletionAction action); |
117 | 118 |
118 inline void RestartIfNotMarking() { | 119 inline void RestartIfNotMarking() { |
119 if (state_ == COMPLETE) { | 120 if (state_ == COMPLETE) { |
120 state_ = MARKING; | 121 state_ = MARKING; |
121 if (FLAG_trace_incremental_marking) { | 122 if (FLAG_trace_incremental_marking) { |
122 PrintF("[IncrementalMarking] Restarting (new grey objects)\n"); | 123 PrintF("[IncrementalMarking] Restarting (new grey objects)\n"); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 205 } |
205 | 206 |
206 MarkingDeque* marking_deque() { return &marking_deque_; } | 207 MarkingDeque* marking_deque() { return &marking_deque_; } |
207 | 208 |
208 bool IsCompacting() { return IsMarking() && is_compacting_; } | 209 bool IsCompacting() { return IsMarking() && is_compacting_; } |
209 | 210 |
210 void ActivateGeneratedStub(Code* stub); | 211 void ActivateGeneratedStub(Code* stub); |
211 | 212 |
212 void NotifyOfHighPromotionRate() { | 213 void NotifyOfHighPromotionRate() { |
213 if (IsMarking()) { | 214 if (IsMarking()) { |
214 if (allocation_marking_factor_ < kFastMarking) { | 215 if (marking_speed_ < kFastMarking) { |
215 if (FLAG_trace_gc) { | 216 if (FLAG_trace_gc) { |
216 PrintPID("Increasing marking speed to %d " | 217 PrintPID("Increasing marking speed to %d " |
217 "due to high promotion rate\n", | 218 "due to high promotion rate\n", |
218 static_cast<int>(kFastMarking)); | 219 static_cast<int>(kFastMarking)); |
219 } | 220 } |
220 allocation_marking_factor_ = kFastMarking; | 221 marking_speed_ = kFastMarking; |
221 } | 222 } |
222 } | 223 } |
223 } | 224 } |
224 | 225 |
225 void EnterNoMarkingScope() { | 226 void EnterNoMarkingScope() { |
226 no_marking_scope_depth_++; | 227 no_marking_scope_depth_++; |
227 } | 228 } |
228 | 229 |
229 void LeaveNoMarkingScope() { | 230 void LeaveNoMarkingScope() { |
230 no_marking_scope_depth_--; | 231 no_marking_scope_depth_--; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 | 269 |
269 int steps_count_; | 270 int steps_count_; |
270 double steps_took_; | 271 double steps_took_; |
271 double longest_step_; | 272 double longest_step_; |
272 int64_t old_generation_space_available_at_start_of_incremental_; | 273 int64_t old_generation_space_available_at_start_of_incremental_; |
273 int64_t old_generation_space_used_at_start_of_incremental_; | 274 int64_t old_generation_space_used_at_start_of_incremental_; |
274 int steps_count_since_last_gc_; | 275 int steps_count_since_last_gc_; |
275 double steps_took_since_last_gc_; | 276 double steps_took_since_last_gc_; |
276 int64_t bytes_rescanned_; | 277 int64_t bytes_rescanned_; |
277 bool should_hurry_; | 278 bool should_hurry_; |
278 int allocation_marking_factor_; | 279 int marking_speed_; |
279 intptr_t bytes_scanned_; | 280 intptr_t bytes_scanned_; |
280 intptr_t allocated_; | 281 intptr_t allocated_; |
| 282 intptr_t write_barriers_invoked_since_last_step_; |
281 | 283 |
282 int no_marking_scope_depth_; | 284 int no_marking_scope_depth_; |
283 | 285 |
284 DISALLOW_IMPLICIT_CONSTRUCTORS(IncrementalMarking); | 286 DISALLOW_IMPLICIT_CONSTRUCTORS(IncrementalMarking); |
285 }; | 287 }; |
286 | 288 |
287 } } // namespace v8::internal | 289 } } // namespace v8::internal |
288 | 290 |
289 #endif // V8_INCREMENTAL_MARKING_H_ | 291 #endif // V8_INCREMENTAL_MARKING_H_ |
OLD | NEW |