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; |