| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_INCREMENTAL_MARKING_H_ | 5 #ifndef V8_HEAP_INCREMENTAL_MARKING_H_ |
| 6 #define V8_HEAP_INCREMENTAL_MARKING_H_ | 6 #define V8_HEAP_INCREMENTAL_MARKING_H_ |
| 7 | 7 |
| 8 #include "src/cancelable-task.h" | 8 #include "src/cancelable-task.h" |
| 9 #include "src/execution.h" | 9 #include "src/execution.h" |
| 10 #include "src/heap/heap.h" | 10 #include "src/heap/heap.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 StepActions step_actions); | 116 StepActions step_actions); |
| 117 | 117 |
| 118 // It's hard to know how much work the incremental marker should do to make | 118 // It's hard to know how much work the incremental marker should do to make |
| 119 // progress in the face of the mutator creating new work for it. We start | 119 // progress in the face of the mutator creating new work for it. We start |
| 120 // of at a moderate rate of work and gradually increase the speed of the | 120 // of at a moderate rate of work and gradually increase the speed of the |
| 121 // incremental marker until it completes. | 121 // incremental marker until it completes. |
| 122 // Do some marking every time this much memory has been allocated or that many | 122 // Do some marking every time this much memory has been allocated or that many |
| 123 // heavy (color-checking) write barriers have been invoked. | 123 // heavy (color-checking) write barriers have been invoked. |
| 124 static const intptr_t kAllocatedThreshold = 65536; | 124 static const intptr_t kAllocatedThreshold = 65536; |
| 125 static const intptr_t kWriteBarriersInvokedThreshold = 32768; | 125 static const intptr_t kWriteBarriersInvokedThreshold = 32768; |
| 126 // Start off by marking this many times more memory than has been allocated. | 126 // Cap the write barrier counter to avoid overflows. |
| 127 static const intptr_t kInitialMarkingSpeed = 1; | 127 static const intptr_t kMaxWriteBarrierCounter = 1 << 20; |
| 128 // But if we are promoting a lot of data we need to mark faster to keep up | 128 // These constants are arbitrary and chosen based on benchmarks. |
| 129 // with the data that is entering the old space through promotion. | 129 static const intptr_t kBytesToMarkPerAllocatedByte = 3; |
| 130 static const intptr_t kFastMarking = 3; | 130 static const intptr_t kBytesToMarkPerWriteBarrier = 10; |
| 131 // After this many steps we increase the marking/allocating factor. | 131 static const intptr_t kMinIncrementalStepDurationInMs = 1; |
| 132 static const intptr_t kMarkingSpeedAccellerationInterval = 1024; | |
| 133 // This is how much we increase the marking/allocating factor by. | |
| 134 static const intptr_t kMarkingSpeedAccelleration = 2; | |
| 135 static const intptr_t kMaxMarkingSpeed = 1000; | |
| 136 | 132 |
| 137 // This is the upper bound for how many times we allow finalization of | 133 // This is the upper bound for how many times we allow finalization of |
| 138 // incremental marking to be postponed. | 134 // incremental marking to be postponed. |
| 139 static const size_t kMaxIdleMarkingDelayCounter = 3; | 135 static const size_t kMaxIdleMarkingDelayCounter = 3; |
| 140 | 136 |
| 141 void FinalizeSweeping(); | 137 void FinalizeSweeping(); |
| 142 | 138 |
| 143 void OldSpaceStep(intptr_t allocated); | 139 void OldSpaceStep(intptr_t allocated); |
| 144 | 140 |
| 145 intptr_t Step(intptr_t allocated, CompletionAction action, | 141 intptr_t Step(intptr_t allocated, CompletionAction action, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 } | 176 } |
| 181 | 177 |
| 182 inline void SetNewSpacePageFlags(Page* chunk) { | 178 inline void SetNewSpacePageFlags(Page* chunk) { |
| 183 SetNewSpacePageFlags(chunk, IsMarking()); | 179 SetNewSpacePageFlags(chunk, IsMarking()); |
| 184 } | 180 } |
| 185 | 181 |
| 186 bool IsCompacting() { return IsMarking() && is_compacting_; } | 182 bool IsCompacting() { return IsMarking() && is_compacting_; } |
| 187 | 183 |
| 188 void ActivateGeneratedStub(Code* stub); | 184 void ActivateGeneratedStub(Code* stub); |
| 189 | 185 |
| 190 void NotifyOfHighPromotionRate(); | |
| 191 | |
| 192 void NotifyIncompleteScanOfObject(int unscanned_bytes) { | 186 void NotifyIncompleteScanOfObject(int unscanned_bytes) { |
| 193 unscanned_bytes_of_large_object_ = unscanned_bytes; | 187 unscanned_bytes_of_large_object_ = unscanned_bytes; |
| 194 } | 188 } |
| 195 | 189 |
| 196 void ClearIdleMarkingDelayCounter(); | 190 void ClearIdleMarkingDelayCounter(); |
| 197 | 191 |
| 198 bool IsIdleMarkingDelayCounterLimitReached(); | 192 bool IsIdleMarkingDelayCounterLimitReached(); |
| 199 | 193 |
| 200 static void MarkGrey(Heap* heap, HeapObject* object); | 194 static void MarkGrey(Heap* heap, HeapObject* object); |
| 201 | 195 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 incremental_marking_.Step(bytes_allocated, | 242 incremental_marking_.Step(bytes_allocated, |
| 249 IncrementalMarking::GC_VIA_STACK_GUARD); | 243 IncrementalMarking::GC_VIA_STACK_GUARD); |
| 250 } | 244 } |
| 251 | 245 |
| 252 private: | 246 private: |
| 253 IncrementalMarking& incremental_marking_; | 247 IncrementalMarking& incremental_marking_; |
| 254 }; | 248 }; |
| 255 | 249 |
| 256 int64_t SpaceLeftInOldSpace(); | 250 int64_t SpaceLeftInOldSpace(); |
| 257 | 251 |
| 258 void SpeedUp(); | |
| 259 | |
| 260 void ResetStepCounters(); | 252 void ResetStepCounters(); |
| 261 | 253 |
| 262 void StartMarking(); | 254 void StartMarking(); |
| 263 | 255 |
| 264 void StartBlackAllocation(); | 256 void StartBlackAllocation(); |
| 265 void FinishBlackAllocation(); | 257 void FinishBlackAllocation(); |
| 266 | 258 |
| 267 void MarkRoots(); | 259 void MarkRoots(); |
| 268 void MarkObjectGroups(); | 260 void MarkObjectGroups(); |
| 269 void ProcessWeakCells(); | 261 void ProcessWeakCells(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 294 | 286 |
| 295 void IncrementIdleMarkingDelayCounter(); | 287 void IncrementIdleMarkingDelayCounter(); |
| 296 | 288 |
| 297 Heap* heap_; | 289 Heap* heap_; |
| 298 | 290 |
| 299 Observer observer_; | 291 Observer observer_; |
| 300 | 292 |
| 301 State state_; | 293 State state_; |
| 302 bool is_compacting_; | 294 bool is_compacting_; |
| 303 | 295 |
| 304 int steps_count_; | |
| 305 int64_t old_generation_space_available_at_start_of_incremental_; | |
| 306 int64_t old_generation_space_used_at_start_of_incremental_; | |
| 307 int64_t bytes_rescanned_; | |
| 308 bool should_hurry_; | 296 bool should_hurry_; |
| 309 int marking_speed_; | |
| 310 intptr_t bytes_scanned_; | |
| 311 intptr_t allocated_; | 297 intptr_t allocated_; |
| 312 intptr_t write_barriers_invoked_since_last_step_; | 298 intptr_t write_barriers_invoked_since_last_step_; |
| 313 size_t idle_marking_delay_counter_; | 299 size_t idle_marking_delay_counter_; |
| 314 | 300 |
| 315 int unscanned_bytes_of_large_object_; | 301 int unscanned_bytes_of_large_object_; |
| 316 | 302 |
| 317 bool was_activated_; | 303 bool was_activated_; |
| 318 | 304 |
| 319 bool black_allocation_; | 305 bool black_allocation_; |
| 320 | 306 |
| 321 bool finalize_marking_completed_; | 307 bool finalize_marking_completed_; |
| 322 | 308 |
| 323 int incremental_marking_finalization_rounds_; | 309 int incremental_marking_finalization_rounds_; |
| 324 | 310 |
| 325 GCRequestType request_type_; | 311 GCRequestType request_type_; |
| 326 | 312 |
| 327 IncrementalMarkingJob incremental_marking_job_; | 313 IncrementalMarkingJob incremental_marking_job_; |
| 328 | 314 |
| 329 DISALLOW_IMPLICIT_CONSTRUCTORS(IncrementalMarking); | 315 DISALLOW_IMPLICIT_CONSTRUCTORS(IncrementalMarking); |
| 330 }; | 316 }; |
| 331 } // namespace internal | 317 } // namespace internal |
| 332 } // namespace v8 | 318 } // namespace v8 |
| 333 | 319 |
| 334 #endif // V8_HEAP_INCREMENTAL_MARKING_H_ | 320 #endif // V8_HEAP_INCREMENTAL_MARKING_H_ |
| OLD | NEW |