diff options
author | isaacs <i@izs.me> | 2012-07-07 14:07:19 -0700 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2012-07-07 23:45:00 +0200 |
commit | 5b5c8b600528bc31e1bcae2fdcca95ed07427333 (patch) | |
tree | b907119b0c7e945a45703d9fb61e488f32c09e2f /deps/v8/src/heap.cc | |
parent | 3e5139fd2f2df5ef5f532266e5015be8b0033b48 (diff) | |
download | node-5b5c8b600528bc31e1bcae2fdcca95ed07427333.tar.gz |
v8: Upgrade to 3.11.10.14
Diffstat (limited to 'deps/v8/src/heap.cc')
-rw-r--r-- | deps/v8/src/heap.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/deps/v8/src/heap.cc b/deps/v8/src/heap.cc index 172405b72..c37c084fa 100644 --- a/deps/v8/src/heap.cc +++ b/deps/v8/src/heap.cc @@ -5013,7 +5013,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 @@ -5081,16 +5085,30 @@ 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. + // TODO(ulan): Once we enable code compaction for incremental marking, + // 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; } |