Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 8b1494d2807a1d400a7b80c981a2a5220f33453d..3c90d280124aaa3b92ecdadffba322565204c328 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -4184,7 +4184,7 @@ bool Heap::HasHighFragmentation(size_t used, size_t committed) { |
bool Heap::ShouldOptimizeForMemoryUsage() { |
return FLAG_optimize_for_size || isolate()->IsIsolateInBackground() || |
- HighMemoryPressure() || IsLowMemoryDevice(); |
+ HighMemoryPressure(); |
} |
void Heap::ActivateMemoryReducerIfNeeded() { |
@@ -5424,8 +5424,11 @@ const double Heap::kTargetMutatorUtilization = 0.97; |
// F * (1 - MU / (R * (1 - MU))) = 1 |
// F * (R * (1 - MU) - MU) / (R * (1 - MU)) = 1 |
// F = R * (1 - MU) / (R * (1 - MU) - MU) |
-double Heap::HeapGrowingFactor(double gc_speed, double mutator_speed) { |
- if (gc_speed == 0 || mutator_speed == 0) return kMaxHeapGrowingFactor; |
+double Heap::HeapGrowingFactor(double gc_speed, double mutator_speed, |
+ double max_factor) { |
+ DCHECK(max_factor >= kMinHeapGrowingFactor); |
+ DCHECK(max_factor <= kMaxHeapGrowingFactor); |
+ if (gc_speed == 0 || mutator_speed == 0) return max_factor; |
const double speed_ratio = gc_speed / mutator_speed; |
const double mu = kTargetMutatorUtilization; |
@@ -5434,13 +5437,39 @@ double Heap::HeapGrowingFactor(double gc_speed, double mutator_speed) { |
const double b = speed_ratio * (1 - mu) - mu; |
// The factor is a / b, but we need to check for small b first. |
- double factor = |
- (a < b * kMaxHeapGrowingFactor) ? a / b : kMaxHeapGrowingFactor; |
- factor = Min(factor, kMaxHeapGrowingFactor); |
+ double factor = (a < b * max_factor) ? a / b : max_factor; |
+ factor = Min(factor, max_factor); |
factor = Max(factor, kMinHeapGrowingFactor); |
return factor; |
} |
+double Heap::MaxHeapGrowingFactor(size_t max_old_generation_size) { |
+ const double min_small_factor = 1.3; |
+ const double max_small_factor = 2.0; |
+ const double high_factor = 4.0; |
+ |
+ size_t max_old_generation_size_in_mb = max_old_generation_size / MB; |
+ max_old_generation_size_in_mb = |
+ Max(max_old_generation_size_in_mb, |
+ static_cast<size_t>(kMinOldGenerationSize)); |
+ |
+ // If we are on a device with lots of memory, we allow a high heap |
+ // growing factor. |
+ if (max_old_generation_size_in_mb >= kMaxOldGenerationSize) { |
+ return high_factor; |
+ } |
+ |
+ DCHECK_GE(max_old_generation_size_in_mb, kMinOldGenerationSize); |
+ DCHECK_LT(max_old_generation_size_in_mb, kMaxOldGenerationSize); |
+ |
+ // On smaller devices we linearly scale the factor: (X-A)/(B-A)*(D-C)+C |
+ double factor = (max_old_generation_size_in_mb - kMinOldGenerationSize) * |
+ (max_small_factor - min_small_factor) / |
+ (kMaxOldGenerationSize - kMinOldGenerationSize) + |
+ min_small_factor; |
+ return factor; |
+} |
+ |
size_t Heap::CalculateOldGenerationAllocationLimit(double factor, |
size_t old_gen_size) { |
CHECK(factor > 1.0); |
@@ -5465,7 +5494,8 @@ size_t Heap::MinimumAllocationLimitGrowingStep() { |
void Heap::SetOldGenerationAllocationLimit(size_t old_gen_size, double gc_speed, |
double mutator_speed) { |
- double factor = HeapGrowingFactor(gc_speed, mutator_speed); |
+ double max_factor = MaxHeapGrowingFactor(max_old_generation_size_); |
+ double factor = HeapGrowingFactor(gc_speed, mutator_speed, max_factor); |
if (FLAG_trace_gc_verbose) { |
isolate_->PrintWithTimestamp( |
@@ -5475,10 +5505,6 @@ void Heap::SetOldGenerationAllocationLimit(size_t old_gen_size, double gc_speed, |
mutator_speed); |
} |
- if (IsMemoryConstrainedDevice()) { |
- factor = Min(factor, kMaxHeapGrowingFactorMemoryConstrained); |
- } |
- |
if (memory_reducer_->ShouldGrowHeapSlowly() || |
ShouldOptimizeForMemoryUsage()) { |
factor = Min(factor, kConservativeHeapGrowingFactor); |
@@ -5505,7 +5531,8 @@ void Heap::SetOldGenerationAllocationLimit(size_t old_gen_size, double gc_speed, |
void Heap::DampenOldGenerationAllocationLimit(size_t old_gen_size, |
double gc_speed, |
double mutator_speed) { |
- double factor = HeapGrowingFactor(gc_speed, mutator_speed); |
+ double max_factor = MaxHeapGrowingFactor(max_old_generation_size_); |
+ double factor = HeapGrowingFactor(gc_speed, mutator_speed, max_factor); |
size_t limit = CalculateOldGenerationAllocationLimit(factor, old_gen_size); |
if (limit < old_generation_allocation_limit_) { |
if (FLAG_trace_gc_verbose) { |