Chromium Code Reviews| Index: src/incremental-marking.cc | 
| =================================================================== | 
| --- src/incremental-marking.cc (revision 9899) | 
| +++ src/incremental-marking.cc (working copy) | 
| @@ -747,6 +747,7 @@ | 
| if (state_ == MARKING && no_marking_scope_depth_ > 0) return; | 
| intptr_t bytes_to_process = allocated_ * allocation_marking_factor_; | 
| + bytes_scanned_ += bytes_to_process; | 
| 
 
ulan
2011/11/07 17:24:50
Should the heuristics below be active in SWEEPING
 
Erik Corry
2011/11/08 10:29:34
Added a reset of this variable when we start marki
 
 | 
| double start = 0; | 
| @@ -808,33 +809,50 @@ | 
| bool speed_up = false; | 
| + if ((steps_count_ % kAllocationMarkingFactorSpeedupInterval) == 0) { | 
| + if (FLAG_trace_gc) { | 
| + PrintF("Speed up marking after %d steps\n", | 
| + static_cast<int>(kAllocationMarkingFactorSpeedupInterval)); | 
| + } | 
| + speed_up = true; | 
| + } | 
| + | 
| if (old_generation_space_available_at_start_of_incremental_ < 10 * MB || | 
| - SpaceLeftInOldSpace() < | 
| - old_generation_space_available_at_start_of_incremental_ >> 1) { | 
| - // Half of the space that was available is gone while we were | 
| + SpaceLeftInOldSpace() * (allocation_marking_factor_ + 1) < | 
| + old_generation_space_available_at_start_of_incremental_) { | 
| + // 1/n of the space that was available is gone while we were | 
| 
 
ulan
2011/11/07 17:24:50
I think the condition says that 1/n is left and (n
 
Erik Corry
2011/11/08 10:29:34
Done.
 
 | 
| // incrementally marking. | 
| + if (FLAG_trace_gc) PrintF("Speed up marking because of low space left\n"); | 
| speed_up = true; | 
| - old_generation_space_available_at_start_of_incremental_ = | 
| - SpaceLeftInOldSpace(); | 
| } | 
| if (heap_->PromotedTotalSize() > | 
| - old_generation_space_used_at_start_of_incremental_ << 1) { | 
| - // Size of old space doubled while we were incrementally marking. | 
| + (allocation_marking_factor_ + 1) * | 
| + old_generation_space_used_at_start_of_incremental_) { | 
| + // Size of old space multiplied by n while we were incrementally marking. | 
| speed_up = true; | 
| - old_generation_space_used_at_start_of_incremental_ = | 
| - heap_->PromotedTotalSize(); | 
| + if (FLAG_trace_gc) { | 
| + PrintF("Speed up marking because of heap size increase\n"); | 
| + } | 
| } | 
| - if ((steps_count_ % kAllocationMarkingFactorSpeedupInterval) == 0 && | 
| - allocation_marking_factor_ < kMaxAllocationMarkingFactor) { | 
| + // We try to scan at at least twice the speed that we are allocating. | 
| + if ((bytes_scanned_ >> 1) | 
| + + heap_->MaxSemiSpaceSize() // A single scavenge cannot trigger this. | 
| + + allocation_marking_factor_ * MB < // Delay before upping again. | 
| 
 
ulan
2011/11/07 17:24:50
Possible overflow in allocation_marking_factor_ *
 
Erik Corry
2011/11/08 10:29:34
Reduced max allocation marking factor to 1000 to a
 
 | 
| + heap_->PromotedTotalSize() | 
| + - old_generation_space_used_at_start_of_incremental_) { | 
| + if (FLAG_trace_gc) { | 
| + PrintF("Speed up marking because marker was not keeping up\n"); | 
| + } | 
| speed_up = true; | 
| } | 
| if (speed_up) { | 
| allocation_marking_factor_ += kAllocationMarkingFactorSpeedup; | 
| allocation_marking_factor_ = | 
| - static_cast<int>(allocation_marking_factor_ * 1.3); | 
| + Min(kMaxAllocationMarkingFactor, | 
| + static_cast<intptr_t>(allocation_marking_factor_ * 1.3)); | 
| if (FLAG_trace_gc) { | 
| PrintF("Marking speed increased to %d\n", allocation_marking_factor_); | 
| } | 
| @@ -862,6 +880,7 @@ | 
| steps_took_since_last_gc_ = 0; | 
| bytes_rescanned_ = 0; | 
| allocation_marking_factor_ = kInitialAllocationMarkingFactor; | 
| + bytes_scanned_ = 0; | 
| } |