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