[heap] Relax condition for forced finalization of incremental marking.

Forcing finalization after reaching allocation limit regresses gc pause
time in benchmarks as we have to do a lot of non-incremental marking work.

This patch allows overshoot of the limit by some margin.

BUG=chromium:670675,chromium:671994
TBR=mlippautz@chromium.org

Review-Url: https://codereview.chromium.org/2554423005
Cr-Commit-Position: refs/heads/master@{#41625}
This commit is contained in:
ulan 2016-12-09 08:22:51 -08:00 committed by Commit bot
parent 25189ffc36
commit a6976211d1
2 changed files with 15 additions and 2 deletions

View File

@ -265,7 +265,7 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space,
} }
if (incremental_marking()->NeedsFinalization() && if (incremental_marking()->NeedsFinalization() &&
OldGenerationSpaceAvailable() == 0) { AllocationLimitOvershotByLargeMargin()) {
*reason = "Incremental marking needs finalization"; *reason = "Incremental marking needs finalization";
return MARK_COMPACTOR; return MARK_COMPACTOR;
} }
@ -5320,7 +5320,7 @@ bool Heap::ShouldExpandOldGenerationOnSlowAllocation() {
if (ShouldOptimizeForMemoryUsage()) return false; if (ShouldOptimizeForMemoryUsage()) return false;
if (incremental_marking()->NeedsFinalization()) { if (incremental_marking()->NeedsFinalization()) {
return false; return !AllocationLimitOvershotByLargeMargin();
} }
if (incremental_marking()->IsStopped() && if (incremental_marking()->IsStopped() &&

View File

@ -1823,6 +1823,19 @@ class Heap {
static_cast<size_t>(PromotedTotalSize()); static_cast<size_t>(PromotedTotalSize());
} }
// We allow incremental marking to overshoot the allocation limit for
// performace reasons. If the overshoot is too large then we are more
// eager to finalize incremental marking.
inline bool AllocationLimitOvershotByLargeMargin() {
if (old_generation_allocation_limit_ >= PromotedTotalSize()) return false;
uint64_t overshoot = PromotedTotalSize() - old_generation_allocation_limit_;
// Overshoot margin is 50% of allocation limit or half-way to the max heap.
uint64_t margin =
Min(old_generation_allocation_limit_ / 2,
(max_old_generation_size_ - old_generation_allocation_limit_) / 2);
return overshoot >= margin;
}
void UpdateTotalGCTime(double duration); void UpdateTotalGCTime(double duration);
bool MaximumSizeScavenge() { return maximum_size_scavenges_ > 0; } bool MaximumSizeScavenge() { return maximum_size_scavenges_ > 0; }