Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index d0b29f6b0f35b0d84cae3a58d51fff8baf22bb52..fc36be8041f47bd6520f9a9094d92b4e6004f654 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -109,6 +109,7 @@ Heap::Heap() |
#endif // DEBUG |
old_generation_allocation_limit_(initial_old_generation_size_), |
old_gen_exhausted_(false), |
+ optimize_for_memory_usage_(false), |
inline_allocation_disabled_(false), |
store_buffer_rebuilder_(store_buffer()), |
hidden_string_(NULL), |
@@ -4967,6 +4968,9 @@ void Heap::CheckAndNotifyBackgroundIdleNotification(double idle_time_in_ms, |
event.can_start_incremental_gc = incremental_marking()->IsStopped() && |
incremental_marking()->CanBeActivated(); |
memory_reducer_.NotifyBackgroundIdleNotification(event); |
+ optimize_for_memory_usage_ = true; |
+ } else { |
+ optimize_for_memory_usage_ = false; |
} |
} |
@@ -5627,6 +5631,8 @@ intptr_t Heap::CalculateOldGenerationAllocationLimit(double factor, |
void Heap::SetOldGenerationAllocationLimit(intptr_t old_gen_size, |
double gc_speed, |
double mutator_speed) { |
+ const double kConservativeHeapGrowingFactor = 1.3; |
+ |
double factor = HeapGrowingFactor(gc_speed, mutator_speed); |
if (FLAG_trace_gc_verbose) { |
@@ -5644,6 +5650,10 @@ void Heap::SetOldGenerationAllocationLimit(intptr_t old_gen_size, |
factor = Min(factor, kMaxHeapGrowingFactorMemoryConstrained); |
} |
+ if (memory_reducer_.ShouldGrowHeapSlowly() || optimize_for_memory_usage_) { |
+ factor = Min(factor, kConservativeHeapGrowingFactor); |
+ } |
+ |
if (FLAG_stress_compaction || |
mark_compact_collector()->reduce_memory_footprint_) { |
factor = kMinHeapGrowingFactor; |