| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 6295788f0af9a2f4d1e772143ff684362b568d75..5874a45f89946477a44b6d4b4d939e3af7efe11c 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -688,12 +688,18 @@ void Heap::UpdateSurvivalRateTrend(int start_new_space_size) {
|
| (static_cast<double>(young_survivors_after_last_gc_) * 100) /
|
| start_new_space_size;
|
|
|
| - if (survival_rate > kYoungSurvivalRateThreshold) {
|
| + if (survival_rate > kYoungSurvivalRateHighThreshold) {
|
| high_survival_rate_period_length_++;
|
| } else {
|
| high_survival_rate_period_length_ = 0;
|
| }
|
|
|
| + if (survival_rate < kYoungSurvivalRateLowThreshold) {
|
| + low_survival_rate_period_length_++;
|
| + } else {
|
| + low_survival_rate_period_length_ = 0;
|
| + }
|
| +
|
| double survival_rate_diff = survival_rate_ - survival_rate;
|
|
|
| if (survival_rate_diff > kYoungSurvivalRateAllowedDeviation) {
|
| @@ -753,32 +759,6 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
|
|
|
| UpdateSurvivalRateTrend(start_new_space_size);
|
|
|
| - if (!new_space_high_promotion_mode_active_ &&
|
| - new_space_.Capacity() == new_space_.MaximumCapacity() &&
|
| - IsStableOrIncreasingSurvivalTrend() &&
|
| - IsHighSurvivalRate()) {
|
| - // Stable high survival rates even though young generation is at
|
| - // maximum capacity indicates that most objects will be promoted.
|
| - // To decrease scavenger pauses and final mark-sweep pauses, we
|
| - // have to limit maximal capacity of the young generation.
|
| - new_space_high_promotion_mode_active_ = true;
|
| - if (FLAG_trace_gc) {
|
| - PrintF("Limited new space size due to high promotion rate: %d MB\n",
|
| - new_space_.InitialCapacity() / MB);
|
| - }
|
| - } else if (new_space_high_promotion_mode_active_ &&
|
| - IsDecreasingSurvivalTrend() &&
|
| - !IsHighSurvivalRate()) {
|
| - // Decreasing low survival rates might indicate that the above high
|
| - // promotion mode is over and we should allow the young generation
|
| - // to grow again.
|
| - new_space_high_promotion_mode_active_ = false;
|
| - if (FLAG_trace_gc) {
|
| - PrintF("Unlimited new space size due to low promotion rate: %d MB\n",
|
| - new_space_.MaximumCapacity() / MB);
|
| - }
|
| - }
|
| -
|
| size_of_old_gen_at_last_old_space_gc_ = PromotedSpaceSize();
|
|
|
| if (high_survival_rate_during_scavenges &&
|
| @@ -808,6 +788,32 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
|
| UpdateSurvivalRateTrend(start_new_space_size);
|
| }
|
|
|
| + if (!new_space_high_promotion_mode_active_ &&
|
| + new_space_.Capacity() == new_space_.MaximumCapacity() &&
|
| + IsStableOrIncreasingSurvivalTrend() &&
|
| + IsHighSurvivalRate()) {
|
| + // Stable high survival rates even though young generation is at
|
| + // maximum capacity indicates that most objects will be promoted.
|
| + // To decrease scavenger pauses and final mark-sweep pauses, we
|
| + // have to limit maximal capacity of the young generation.
|
| + new_space_high_promotion_mode_active_ = true;
|
| + if (FLAG_trace_gc) {
|
| + PrintF("Limited new space size due to high promotion rate: %d MB\n",
|
| + new_space_.InitialCapacity() / MB);
|
| + }
|
| + } else if (new_space_high_promotion_mode_active_ &&
|
| + IsStableOrDecreasingSurvivalTrend() &&
|
| + IsLowSurvivalRate()) {
|
| + // Decreasing low survival rates might indicate that the above high
|
| + // promotion mode is over and we should allow the young generation
|
| + // to grow again.
|
| + new_space_high_promotion_mode_active_ = false;
|
| + if (FLAG_trace_gc) {
|
| + PrintF("Unlimited new space size due to low promotion rate: %d MB\n",
|
| + new_space_.MaximumCapacity() / MB);
|
| + }
|
| + }
|
| +
|
| if (new_space_high_promotion_mode_active_ &&
|
| new_space_.Capacity() > new_space_.InitialCapacity()) {
|
| new_space_.Shrink();
|
| @@ -1090,7 +1096,7 @@ void Heap::Scavenge() {
|
| isolate_->descriptor_lookup_cache()->Clear();
|
|
|
| // Used for updating survived_since_last_expansion_ at function end.
|
| - intptr_t survived_watermark = PromotedSpaceSize();
|
| + intptr_t survived_watermark = PromotedSpaceSizeOfObjects();
|
|
|
| CheckNewSpaceExpansionCriteria();
|
|
|
| @@ -1182,7 +1188,7 @@ void Heap::Scavenge() {
|
|
|
| // Update how much has survived scavenge.
|
| IncrementYoungSurvivorsCounter(static_cast<int>(
|
| - (PromotedSpaceSize() - survived_watermark) + new_space_.Size()));
|
| + (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size()));
|
|
|
| LOG(isolate_, ResourceEvent("scavenge", "end"));
|
|
|
| @@ -5413,6 +5419,16 @@ intptr_t Heap::PromotedSpaceSize() {
|
| }
|
|
|
|
|
| +intptr_t Heap::PromotedSpaceSizeOfObjects() {
|
| + return old_pointer_space_->SizeOfObjects()
|
| + + old_data_space_->SizeOfObjects()
|
| + + code_space_->SizeOfObjects()
|
| + + map_space_->SizeOfObjects()
|
| + + cell_space_->SizeOfObjects()
|
| + + lo_space_->SizeOfObjects();
|
| +}
|
| +
|
| +
|
| int Heap::PromotedExternalMemorySize() {
|
| if (amount_of_external_allocated_memory_
|
| <= amount_of_external_allocated_memory_at_last_global_gc_) return 0;
|
|
|