| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index df8dde60300c1152daf130f02fb5cef89a19a26c..55cc05e0c64fa896b4ed027af11cfc37d029fff4 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,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;
|
| }
|
|
|
|
|