| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index ec48b324479b6bd90b66fd5af7c728f03e5ac804..32c3e6e0d1eab203138189c05aa2e98420727af7 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -1283,16 +1283,18 @@ bool Heap::PerformGarbageCollection(
|
| // Update relocatables.
|
| Relocatable::PostGarbageCollectionProcessing(isolate_);
|
|
|
| + double gc_speed = tracer()->CombinedMarkCompactSpeedInBytesPerMillisecond();
|
| + double mutator_speed = static_cast<double>(
|
| + tracer()
|
| + ->CurrentOldGenerationAllocationThroughputInBytesPerMillisecond());
|
| + intptr_t old_gen_size = PromotedSpaceSizeOfObjects();
|
| if (collector == MARK_COMPACTOR) {
|
| // Register the amount of external allocated memory.
|
| amount_of_external_allocated_memory_at_last_global_gc_ =
|
| amount_of_external_allocated_memory_;
|
| - double gc_speed = tracer()->CombinedMarkCompactSpeedInBytesPerMillisecond();
|
| - double mutator_speed = static_cast<double>(
|
| - tracer()
|
| - ->CurrentOldGenerationAllocationThroughputInBytesPerMillisecond());
|
| - intptr_t old_gen_size = PromotedSpaceSizeOfObjects();
|
| SetOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed);
|
| + } else if (HasLowYoungGenerationAllocationRate()) {
|
| + DampenOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed);
|
| }
|
|
|
| {
|
| @@ -5575,6 +5577,24 @@ void Heap::SetOldGenerationAllocationLimit(intptr_t old_gen_size,
|
| }
|
|
|
|
|
| +void Heap::DampenOldGenerationAllocationLimit(intptr_t old_gen_size,
|
| + double gc_speed,
|
| + double mutator_speed) {
|
| + double factor = HeapGrowingFactor(gc_speed, mutator_speed);
|
| + intptr_t limit = CalculateOldGenerationAllocationLimit(factor, old_gen_size);
|
| + if (limit < old_generation_allocation_limit_) {
|
| + if (FLAG_trace_gc_verbose) {
|
| + PrintIsolate(isolate_, "Dampen: old size: %" V8_PTR_PREFIX
|
| + "d KB, old limit: %" V8_PTR_PREFIX "d KB, \n",
|
| + "new limit: %" V8_PTR_PREFIX "d KB (%.1f)\n",
|
| + old_gen_size / KB, old_generation_allocation_limit_ / KB,
|
| + limit / KB, factor);
|
| + }
|
| + old_generation_allocation_limit_ = limit;
|
| + }
|
| +}
|
| +
|
| +
|
| void Heap::EnableInlineAllocation() {
|
| if (!inline_allocation_disabled_) return;
|
| inline_allocation_disabled_ = false;
|
|
|