| Index: src/heap/heap.h
|
| diff --git a/src/heap/heap.h b/src/heap/heap.h
|
| index 8f5551aa5540864dd7a8ac51db68373cdf1637e1..90f26fbafee70680d1851f4f327f39eb3a1b4ba2 100644
|
| --- a/src/heap/heap.h
|
| +++ b/src/heap/heap.h
|
| @@ -692,7 +692,7 @@ class Heap {
|
| return old_data_space_->allocation_limit_address();
|
| }
|
|
|
| - // TODO(hpayer): There is still a missmatch between capacity and actual
|
| + // TODO(hpayer): There is still a mismatch between capacity and actual
|
| // committed memory size.
|
| bool CanExpandOldGeneration(int size) {
|
| return (CommittedOldGenerationMemory() + size) < MaxOldGenerationSize();
|
| @@ -1090,15 +1090,13 @@ class Heap {
|
| return old_generation_allocation_limit_ - PromotedTotalSize();
|
| }
|
|
|
| - inline intptr_t OldGenerationCapacityAvailable() {
|
| - return max_old_generation_size_ - PromotedTotalSize();
|
| - }
|
| -
|
| static const intptr_t kMinimumOldGenerationAllocationLimit =
|
| 8 * (Page::kPageSize > MB ? Page::kPageSize : MB);
|
|
|
| static const int kInitalOldGenerationLimitFactor = 2;
|
|
|
| + static const intptr_t kDefaultMaxOldGenSize = 700ul * (kPointerSize / 4) * MB;
|
| +
|
| #if V8_OS_ANDROID
|
| // Don't apply pointer multiplier on Android since it has no swap space and
|
| // should instead adapt it's heap size based on available physical memory.
|
| @@ -1131,8 +1129,9 @@ class Heap {
|
| static const int kMaxExecutableSizeHugeMemoryDevice =
|
| 256 * kPointerMultiplier;
|
|
|
| - intptr_t OldGenerationAllocationLimit(intptr_t old_gen_size,
|
| - int freed_global_handles);
|
| + void SetOldGenerationAllocationLimit(intptr_t old_gen_size,
|
| + int freed_global_handles,
|
| + bool weak_callbacks_completed);
|
|
|
| // Indicates whether inline bump-pointer allocation has been disabled.
|
| bool inline_allocation_disabled() { return inline_allocation_disabled_; }
|
| @@ -1245,8 +1244,28 @@ class Heap {
|
|
|
| intptr_t adjusted_allocation_limit =
|
| old_generation_allocation_limit_ - new_space_.Capacity();
|
| + intptr_t adjusted_committed_limit =
|
| + old_generation_committed_memory_limit_ - new_space_.Capacity();
|
| +
|
| + if (PromotedTotalSize() >= adjusted_allocation_limit) {
|
| + if (FLAG_trace_gc_verbose) {
|
| + PrintF("Next GC likely to be full: We are at %" V8_PTR_PREFIX
|
| + "dMbytes out of %" V8_PTR_PREFIX "dMbytes\n",
|
| + PromotedTotalSize() >> 20,
|
| + old_generation_allocation_limit_ >> 20);
|
| + }
|
| + return true;
|
| + }
|
|
|
| - if (PromotedTotalSize() >= adjusted_allocation_limit) return true;
|
| + if (CommittedOldGenerationMemory() >= adjusted_committed_limit) {
|
| + if (FLAG_trace_gc_verbose) {
|
| + PrintF("Next GC likely to be full: We are at %" V8_PTR_PREFIX
|
| + "dMbytes committed out of %" V8_PTR_PREFIX "dMbytes\n",
|
| + CommittedOldGenerationMemory() >> 20,
|
| + old_generation_committed_memory_limit_ >> 20);
|
| + }
|
| + return true;
|
| + }
|
|
|
| return false;
|
| }
|
| @@ -1645,9 +1664,14 @@ 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.
|
| + // generation and on every allocation in large object space. This only
|
| + // measures objects, so it may be underreporting if we have fragmentation.
|
| intptr_t old_generation_allocation_limit_;
|
|
|
| + // As above, but counts pages, not objects, so is more likely to trigger
|
| + // when we have fragmentation.
|
| + intptr_t old_generation_committed_memory_limit_;
|
| +
|
| // Indicates that an allocation has failed in the old generation since the
|
| // last GC.
|
| bool old_gen_exhausted_;
|
| @@ -2080,8 +2104,6 @@ class Heap {
|
| double idle_time_in_ms, size_t size_of_objects,
|
| size_t mark_compact_speed_in_bytes_per_ms);
|
|
|
| - bool WorthActivatingIncrementalMarking();
|
| -
|
| void ClearObjectStats(bool clear_last_time_stats = false);
|
|
|
| inline void UpdateAllocationsHash(HeapObject* object);
|
|
|