Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index a4d28792caf009f2df3fc0c723624829a4a4589b..9686e0dac2129bd784305be2032200965f616d95 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -267,6 +267,13 @@ |
return MARK_COMPACTOR; |
} |
+ // Is enough data promoted to justify a global GC? |
+ if (OldGenerationAllocationLimitReached()) { |
+ isolate_->counters()->gc_compactor_caused_by_promoted_data()->Increment(); |
+ *reason = "promotion limit reached"; |
+ return MARK_COMPACTOR; |
+ } |
+ |
// Is there enough space left in OLD to guarantee that a scavenge can |
// succeed? |
// |
@@ -961,7 +968,7 @@ |
if (collector == MARK_COMPACTOR && !ShouldFinalizeIncrementalMarking() && |
!ShouldAbortIncrementalMarking() && !incremental_marking()->IsStopped() && |
!incremental_marking()->should_hurry() && FLAG_incremental_marking && |
- OldGenerationSpaceAvailable() <= 0) { |
+ OldGenerationAllocationLimitReached()) { |
if (!incremental_marking()->IsComplete() && |
!mark_compact_collector()->marking_deque_.IsEmpty() && |
!FLAG_gc_global) { |
@@ -1073,15 +1080,10 @@ |
void Heap::StartIncrementalMarkingIfAllocationLimitIsReached( |
int gc_flags, const GCCallbackFlags gc_callback_flags) { |
- if (incremental_marking()->IsStopped()) { |
- IncrementalMarkingLimit reached_limit = IncrementalMarkingLimitReached(); |
- if (reached_limit == IncrementalMarkingLimit::kSoftLimit) { |
- incremental_marking()->incremental_marking_job()->ScheduleTask(this); |
- } else if (reached_limit == IncrementalMarkingLimit::kHardLimit) { |
- StartIncrementalMarking(gc_flags, |
- GarbageCollectionReason::kAllocationLimit, |
- gc_callback_flags); |
- } |
+ if (incremental_marking()->IsStopped() && |
+ incremental_marking()->ShouldActivateEvenWithoutIdleNotification()) { |
+ StartIncrementalMarking(gc_flags, GarbageCollectionReason::kAllocationLimit, |
+ gc_callback_flags); |
} |
} |
@@ -5330,6 +5332,7 @@ |
} |
} |
+ |
void Heap::DampenOldGenerationAllocationLimit(intptr_t old_gen_size, |
double gc_speed, |
double mutator_speed) { |
@@ -5348,53 +5351,6 @@ |
} |
} |
-// This predicate is called when an old generation space cannot allocated from |
-// the free list and is about to add a new page. Returning false will cause a |
-// major GC. It happens when the old generation allocation limit is reached and |
-// - either we need to optimize for memory usage, |
-// - or the incremental marking is not in progress and we cannot start it. |
-bool Heap::ShouldExpandOldGenerationOnAllocationFailure() { |
- if (always_allocate() || OldGenerationSpaceAvailable() > 0) return true; |
- // We reached the old generation allocation limit. |
- |
- if (ShouldOptimizeForMemoryUsage()) return false; |
- |
- if (incremental_marking()->IsStopped() && |
- IncrementalMarkingLimitReached() == IncrementalMarkingLimit::kNoLimit) { |
- // We cannot start incremental marking. |
- return false; |
- } |
- return true; |
-} |
- |
-// This function returns either kNoLimit, kSoftLimit, or kHardLimit. |
-// The kNoLimit means that either incremental marking is disabled or it is too |
-// early to start incremental marking. |
-// The kSoftLimit means that incremental marking should be started soon. |
-// The kHardLimit means that incremental marking should be started immediately. |
-Heap::IncrementalMarkingLimit Heap::IncrementalMarkingLimitReached() { |
- if (!incremental_marking()->CanBeActivated() || |
- PromotedSpaceSizeOfObjects() < IncrementalMarking::kActivationThreshold) { |
- // Incremental marking is disabled or it is too early to start. |
- return IncrementalMarkingLimit::kNoLimit; |
- } |
- if ((FLAG_stress_compaction && (gc_count_ & 1) != 0) || |
- HighMemoryPressure()) { |
- // If there is high memory pressure or stress testing is enabled, then |
- // start marking immediately. |
- return IncrementalMarkingLimit::kHardLimit; |
- } |
- intptr_t old_generation_space_available = OldGenerationSpaceAvailable(); |
- if (old_generation_space_available > new_space_->Capacity()) { |
- return IncrementalMarkingLimit::kNoLimit; |
- } |
- // We are close to the allocation limit. |
- // Choose between the hard and the soft limits. |
- if (old_generation_space_available <= 0 || ShouldOptimizeForMemoryUsage()) { |
- return IncrementalMarkingLimit::kHardLimit; |
- } |
- return IncrementalMarkingLimit::kSoftLimit; |
-} |
void Heap::EnableInlineAllocation() { |
if (!inline_allocation_disabled_) return; |