| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 8b08802f461acd17f24c2e2676a39f2812fcd684..4e4f04a11293e71b330eba36293406c69c8e628d 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -733,6 +733,9 @@ void Heap::GarbageCollectionEpilogue() {
|
| // whether we allocated in new space since the last GC.
|
| new_space_top_after_last_gc_ = new_space()->top();
|
| last_gc_time_ = MonotonicallyIncreasingTimeInMs();
|
| +
|
| + ReduceNewSpaceSize(
|
| + tracer()->CurrentNewSpaceAllocationThroughputInBytesPerMillisecond());
|
| }
|
|
|
|
|
| @@ -4569,11 +4572,15 @@ void Heap::MakeHeapIterable() {
|
| }
|
|
|
|
|
| -void Heap::ReduceNewSpaceSize(GCIdleTimeAction action) {
|
| - if (action.reduce_memory &&
|
| - (action.type == DO_SCAVENGE || action.type == DO_FULL_GC ||
|
| - (action.type == DO_INCREMENTAL_MARKING &&
|
| - incremental_marking()->IsStopped()))) {
|
| +bool Heap::HasLowAllocationRate(size_t allocation_rate) {
|
| + static const size_t kLowAllocationRate = 1000;
|
| + if (allocation_rate == 0) return false;
|
| + return allocation_rate < kLowAllocationRate;
|
| +}
|
| +
|
| +
|
| +void Heap::ReduceNewSpaceSize(size_t allocation_rate) {
|
| + if (HasLowAllocationRate(allocation_rate)) {
|
| new_space_.Shrink();
|
| UncommitFromSpace();
|
| }
|
| @@ -4639,6 +4646,8 @@ GCIdleTimeHandler::HeapState Heap::ComputeHeapState(bool reduce_memory) {
|
| heap_state.new_space_capacity = new_space_.Capacity();
|
| heap_state.new_space_allocation_throughput_in_bytes_per_ms =
|
| tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond();
|
| + heap_state.current_new_space_allocation_throughput_in_bytes_per_ms =
|
| + tracer()->CurrentNewSpaceAllocationThroughputInBytesPerMillisecond();
|
| return heap_state;
|
| }
|
|
|
| @@ -4701,7 +4710,6 @@ bool Heap::PerformIdleTimeAction(GCIdleTimeAction action,
|
| break;
|
| }
|
|
|
| - ReduceNewSpaceSize(action);
|
| return result;
|
| }
|
|
|
| @@ -4966,6 +4974,7 @@ void Heap::Verify() {
|
|
|
|
|
| void Heap::ZapFromSpace() {
|
| + if (!new_space_.IsFromSpaceCommitted()) return;
|
| NewSpacePageIterator it(new_space_.FromSpaceStart(),
|
| new_space_.FromSpaceEnd());
|
| while (it.has_next()) {
|
|
|