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; |
} |