Reviewers: Michael Starzinger,

Message:
I have to investigate the problem in detail.

Description:
Revert "Simplifying GC heuristics, deleted old generation allocation limit."

This reverts commit dde70b769a5957e2434929cfb3ba269818252a56.

BUG=


Please review this at https://codereview.chromium.org/14750013/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/heap.h
  M src/heap.cc


Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index ab3f8a3075b0bfe517db7ae79ffa75d884a75e1b..a69c539911da64045d1cae9f109e7847d2d83b07 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -118,7 +118,8 @@ Heap::Heap()
       disallow_allocation_failure_(false),
 #endif  // DEBUG
       new_space_high_promotion_mode_active_(false),
- old_generation_allocation_limit_(kMinimumOldGenerationAllocationLimit),
+      old_gen_promotion_limit_(kMinimumPromotionLimit),
+      old_gen_allocation_limit_(kMinimumAllocationLimit),
       size_of_old_gen_at_last_old_space_gc_(0),
       external_allocation_limit_(0),
       amount_of_external_allocated_memory_(0),
@@ -281,7 +282,7 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space,
   }

   // Is enough data promoted to justify a global GC?
-  if (OldGenerationAllocationLimitReached()) {
+  if (OldGenerationPromotionLimitReached()) {
isolate_->counters()->gc_compactor_caused_by_promoted_data()->Increment();
     *reason = "promotion limit reached";
     return MARK_COMPACTOR;
@@ -915,8 +916,10 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,

     size_of_old_gen_at_last_old_space_gc_ = PromotedSpaceSizeOfObjects();

-    old_generation_allocation_limit_ =
- OldGenerationAllocationLimit(size_of_old_gen_at_last_old_space_gc_);
+    old_gen_promotion_limit_ =
+        OldGenPromotionLimit(size_of_old_gen_at_last_old_space_gc_);
+    old_gen_allocation_limit_ =
+        OldGenAllocationLimit(size_of_old_gen_at_last_old_space_gc_);

     old_gen_exhausted_ = false;
   } else {
@@ -5959,8 +5962,10 @@ void Heap::ReportHeapStatistics(const char* title) {
   USE(title);
   PrintF(">>>>>> =============== %s (%d) =============== >>>>>>\n",
          title, gc_count_);
-  PrintF("old_generation_allocation_limit_ %" V8_PTR_PREFIX "d\n",
-         old_generation_allocation_limit_);
+  PrintF("old_gen_promotion_limit_ %" V8_PTR_PREFIX "d\n",
+         old_gen_promotion_limit_);
+  PrintF("old_gen_allocation_limit_ %" V8_PTR_PREFIX "d\n",
+         old_gen_allocation_limit_);

   PrintF("\n");
PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_));
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_;



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to