| Index: src/heap.h
|
| diff --git a/src/heap.h b/src/heap.h
|
| index 9f054400a07620bcb1d93e43f4039b9a44fad5d8..b24b0b3608344ffba6177e42df6edf3c02f217e2 100644
|
| --- a/src/heap.h
|
| +++ b/src/heap.h
|
| @@ -1561,23 +1561,44 @@ class Heap {
|
| return PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize();
|
| }
|
|
|
| + // True if we have reached the allocation limit in the old generation that
|
| + // should force the next GC (caused normally) to be a full one.
|
| + inline bool OldGenerationPromotionLimitReached() {
|
| + return PromotedTotalSize() > old_gen_promotion_limit_;
|
| + }
|
| +
|
| inline intptr_t OldGenerationSpaceAvailable() {
|
| - return old_generation_allocation_limit_ - PromotedTotalSize();
|
| + return old_gen_allocation_limit_ - PromotedTotalSize();
|
| }
|
|
|
| inline intptr_t OldGenerationCapacityAvailable() {
|
| return max_old_generation_size_ - PromotedTotalSize();
|
| }
|
|
|
| - static const intptr_t kMinimumOldGenerationAllocationLimit =
|
| + static const intptr_t kMinimumPromotionLimit = 5 * Page::kPageSize;
|
| + static const intptr_t kMinimumAllocationLimit =
|
| 8 * (Page::kPageSize > MB ? Page::kPageSize : MB);
|
|
|
| - intptr_t OldGenerationAllocationLimit(intptr_t old_gen_size) {
|
| + intptr_t OldGenPromotionLimit(intptr_t old_gen_size) {
|
| const int divisor = FLAG_stress_compaction ? 10 :
|
| new_space_high_promotion_mode_active_ ? 1 : 3;
|
| intptr_t limit =
|
| - Max(old_gen_size + old_gen_size / divisor,
|
| - kMinimumOldGenerationAllocationLimit);
|
| + Max(old_gen_size + old_gen_size / divisor, kMinimumPromotionLimit);
|
| + limit += new_space_.Capacity();
|
| + // TODO(hpayer): Can be removed when when pretenuring is supported for all
|
| + // allocation sites.
|
| + if (IsHighSurvivalRate() && IsStableOrIncreasingSurvivalTrend()) {
|
| + limit *= 2;
|
| + }
|
| + intptr_t halfway_to_the_max = (old_gen_size + max_old_generation_size_) / 2;
|
| + return Min(limit, halfway_to_the_max);
|
| + }
|
| +
|
| + intptr_t OldGenAllocationLimit(intptr_t old_gen_size) {
|
| + const int divisor = FLAG_stress_compaction ? 8 :
|
| + new_space_high_promotion_mode_active_ ? 1 : 2;
|
| + intptr_t limit =
|
| + Max(old_gen_size + old_gen_size / divisor, kMinimumAllocationLimit);
|
| limit += new_space_.Capacity();
|
| // TODO(hpayer): Can be removed when when pretenuring is supported for all
|
| // allocation sites.
|
| @@ -1658,14 +1679,22 @@ class Heap {
|
|
|
| if (FLAG_stress_compaction && (gc_count_ & 1) != 0) return true;
|
|
|
| + intptr_t total_promoted = PromotedTotalSize();
|
| +
|
| + intptr_t adjusted_promotion_limit =
|
| + old_gen_promotion_limit_ - new_space_.Capacity();
|
| +
|
| + if (total_promoted >= adjusted_promotion_limit) return true;
|
| +
|
| intptr_t adjusted_allocation_limit =
|
| - old_generation_allocation_limit_ - new_space_.Capacity();
|
| + old_gen_allocation_limit_ - new_space_.Capacity() / 5;
|
|
|
| - if (PromotedTotalSize() >= adjusted_allocation_limit) return true;
|
| + if (PromotedSpaceSizeOfObjects() >= adjusted_allocation_limit) return true;
|
|
|
| return false;
|
| }
|
|
|
| +
|
| void UpdateNewSpaceReferencesInExternalStringTable(
|
| ExternalStringTableUpdaterCallback updater_func);
|
|
|
| @@ -1990,9 +2019,13 @@ class Heap {
|
|
|
| // Limit that triggers a global GC on the next (normally caused) GC. This
|
| // is checked when we have already decided to do a GC to help determine
|
| - // which collector to invoke, before expanding a paged space in the old
|
| - // generation and on every allocation in large object space.
|
| - intptr_t old_generation_allocation_limit_;
|
| + // which collector to invoke.
|
| + intptr_t old_gen_promotion_limit_;
|
| +
|
| + // Limit that triggers a global GC as soon as is reasonable. This is
|
| + // checked before expanding a paged space in the old generation and on
|
| + // every allocation in large object space.
|
| + intptr_t old_gen_allocation_limit_;
|
|
|
| // Used to adjust the limits that control the timing of the next GC.
|
| intptr_t size_of_old_gen_at_last_old_space_gc_;
|
| @@ -2010,7 +2043,7 @@ class Heap {
|
|
|
| // Indicates that an allocation has failed in the old generation since the
|
| // last GC.
|
| - bool old_gen_exhausted_;
|
| + int old_gen_exhausted_;
|
|
|
| Object* native_contexts_list_;
|
|
|
|
|