Chromium Code Reviews| Index: src/heap.cc |
| diff --git a/src/heap.cc b/src/heap.cc |
| index df8dde60300c1152daf130f02fb5cef89a19a26c..9ab1cbb5b0434018ec80be3488083e817ddce4b0 100644 |
| --- a/src/heap.cc |
| +++ b/src/heap.cc |
| @@ -5014,7 +5014,11 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { |
| bool Heap::IdleNotification(int hint) { |
| + // Hints greater than this value indicate that |
| + // the embedder is requesting a lot of GC work. |
| const int kMaxHint = 1000; |
| + // Minimal hint that allows to do full GC. |
| + const int kMinHintForFullGC = 100; |
| intptr_t size_factor = Min(Max(hint, 20), kMaxHint) / 4; |
| // The size factor is in range [5..250]. The numbers here are chosen from |
| // experiments. If you changes them, make sure to test with |
| @@ -5082,16 +5086,29 @@ bool Heap::IdleNotification(int hint) { |
| mark_sweeps_since_idle_round_started_ += new_mark_sweeps; |
| ms_count_at_last_idle_notification_ = ms_count_; |
| - if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) { |
| + int remaining_mark_sweeps = kMaxMarkSweepsInIdleRound - |
| + mark_sweeps_since_idle_round_started_; |
| + |
| + if (remaining_mark_sweeps <= 0) { |
| FinishIdleRound(); |
| return true; |
| } |
| if (incremental_marking()->IsStopped()) { |
| - incremental_marking()->Start(); |
| + // If there are no more than two GCs left in this idle round and we are |
| + // allowed to do a full GC, then make those GCs full in order to compact |
| + // the code space. Once we enable code compaction for incremental marking, |
|
Michael Starzinger
2012/06/21 16:24:12
Maybe mark the second sentence as a TODO, to empha
ulan
2012/06/22 08:15:57
Done.
|
| + // we can get rid of this special case and always start incremental marking. |
| + if (remaining_mark_sweeps <= 2 && hint >= kMinHintForFullGC){ |
| + CollectAllGarbage(kReduceMemoryFootprintMask, |
| + "idle notification: finalize idle round"); |
| + } else { |
| + incremental_marking()->Start(); |
| + } |
| + } |
| + if (!incremental_marking()->IsStopped()) { |
| + AdvanceIdleIncrementalMarking(step_size); |
| } |
| - |
| - AdvanceIdleIncrementalMarking(step_size); |
| return false; |
| } |