Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 5d3bde4592c991844f1f024c7ab7cb391702d2e7..5bd833960be97a26f44f34c4b7652b91372496b2 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -16,6 +16,7 @@ |
#include "src/debug.h" |
#include "src/deoptimizer.h" |
#include "src/global-handles.h" |
+#include "src/heap/gc-idle-time-handler.h" |
#include "src/heap/incremental-marking.h" |
#include "src/heap/mark-compact.h" |
#include "src/heap/objects-visiting-inl.h" |
@@ -4263,7 +4264,10 @@ void Heap::MakeHeapIterable() { |
} |
-void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { |
+void Heap::AdvanceIdleIncrementalMarking(int idle_time_in_ms) { |
+ intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize( |
+ idle_time_in_ms, tracer_.IncrementalMarkingSpeedInBytesPerMillisecond()); |
+ |
incremental_marking()->Step(step_size, |
IncrementalMarking::NO_GC_VIA_STACK_GUARD, true); |
@@ -4286,36 +4290,27 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { |
} |
-bool Heap::IdleNotification(int hint) { |
+bool Heap::IdleNotification(int idle_time_in_ms) { |
// If incremental marking is off, we do not perform idle notification. |
if (!FLAG_incremental_marking) return true; |
- // Hints greater than this value indicate that |
- // the embedder is requesting a lot of GC work. |
- const int kMaxHint = 1000; |
- const int kMinHintForIncrementalMarking = 10; |
// 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 |
- // chrome/performance_ui_tests --gtest_filter="GeneralMixMemoryTest.* |
- intptr_t step_size = size_factor * IncrementalMarking::kAllocatedThreshold; |
- |
- isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample(hint); |
+ isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( |
+ idle_time_in_ms); |
HistogramTimerScope idle_notification_scope( |
isolate_->counters()->gc_idle_notification()); |
if (contexts_disposed_ > 0) { |
contexts_disposed_ = 0; |
int mark_sweep_time = Min(TimeMarkSweepWouldTakeInMs(), 1000); |
- if (hint >= mark_sweep_time && !FLAG_expose_gc && |
+ if (idle_time_in_ms >= mark_sweep_time && !FLAG_expose_gc && |
incremental_marking()->IsStopped()) { |
HistogramTimerScope scope(isolate_->counters()->gc_context()); |
CollectAllGarbage(kReduceMemoryFootprintMask, |
"idle notification: contexts disposed"); |
} else { |
- AdvanceIdleIncrementalMarking(step_size); |
+ AdvanceIdleIncrementalMarking(idle_time_in_ms); |
} |
// After context disposal there is likely a lot of garbage remaining, reset |
@@ -4350,17 +4345,16 @@ bool Heap::IdleNotification(int hint) { |
// 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) { |
+ if (remaining_mark_sweeps <= 2 && idle_time_in_ms >= kMinHintForFullGC) { |
CollectAllGarbage(kReduceMemoryFootprintMask, |
"idle notification: finalize idle round"); |
mark_sweeps_since_idle_round_started_++; |
- } else if (hint > kMinHintForIncrementalMarking) { |
+ } else { |
incremental_marking()->Start(); |
} |
} |
- if (!incremental_marking()->IsStopped() && |
- hint > kMinHintForIncrementalMarking) { |
- AdvanceIdleIncrementalMarking(step_size); |
+ if (!incremental_marking()->IsStopped()) { |
+ AdvanceIdleIncrementalMarking(idle_time_in_ms); |
} |
if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) { |
@@ -4370,7 +4364,7 @@ bool Heap::IdleNotification(int hint) { |
// If the IdleNotifcation is called with a large hint we will wait for |
// the sweepter threads here. |
- if (hint >= kMinHintForFullGC && |
+ if (idle_time_in_ms >= kMinHintForFullGC && |
mark_compact_collector()->sweeping_in_progress()) { |
mark_compact_collector()->EnsureSweepingCompleted(); |
} |