From 22b1da99732b4db0754bf267ec470a2831216fb2 Mon Sep 17 00:00:00 2001 From: ulan Date: Thu, 21 May 2015 05:50:45 -0700 Subject: [PATCH] Avoid excessive GCs in small heaps. Small heaps and small heap growing factor can lead to excessive GCs in corner cases. Consider function F(old_gen_size, factor) that returns the number of bytes that have to be allocated in the old generation to start incremental marking. F(4MB, 1.1) = 4MB (because of kMinimumOldGenerationAllocationLimit) F(6MB, 1.1) = 2MB (because of kMinimumOldGenerationAllocationLimit) F(8MB, 1.1) = 800KB Funtion F should be monotonic in old_gen_size, but it currently has a minimum at kMinimumOldGenerationAllocationLimit. This CL makes F monotonic. BUG= Review URL: https://codereview.chromium.org/1144223002 Cr-Commit-Position: refs/heads/master@{#28549} --- src/heap/heap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/heap/heap.cc b/src/heap/heap.cc index e801ff94c..d53acdcb6 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -5303,7 +5303,7 @@ intptr_t Heap::CalculateOldGenerationAllocationLimit(double factor, CHECK(factor > 1.0); CHECK(old_gen_size > 0); intptr_t limit = static_cast(old_gen_size * factor); - limit = Max(limit, kMinimumOldGenerationAllocationLimit); + limit = Max(limit, old_gen_size + kMinimumOldGenerationAllocationLimit); limit += new_space_.Capacity(); intptr_t halfway_to_the_max = (old_gen_size + max_old_generation_size_) / 2; return Min(limit, halfway_to_the_max); -- 2.34.1