Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Side by Side Diff: src/heap/heap.cc

Issue 2256853003: [heap] Introduce hard limit for external memory (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix compilation Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/heap.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/ast/context-slot-cache.h" 9 #include "src/ast/context-slot-cache.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 void Step(int bytes_allocated, Address, size_t) override { 64 void Step(int bytes_allocated, Address, size_t) override {
65 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated); 65 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated);
66 } 66 }
67 67
68 private: 68 private:
69 Heap& heap_; 69 Heap& heap_;
70 }; 70 };
71 71
72 Heap::Heap() 72 Heap::Heap()
73 : external_memory_(0), 73 : external_memory_(0),
74 external_memory_limit_(kExternalAllocationLimit), 74 external_memory_limit_(kExternalAllocationSoftLimit),
75 external_memory_at_last_mark_compact_(0), 75 external_memory_at_last_mark_compact_(0),
76 isolate_(nullptr), 76 isolate_(nullptr),
77 code_range_size_(0), 77 code_range_size_(0),
78 // semispace_size_ should be a power of 2 and old_generation_size_ should 78 // semispace_size_ should be a power of 2 and old_generation_size_ should
79 // be a multiple of Page::kPageSize. 79 // be a multiple of Page::kPageSize.
80 max_semi_space_size_(8 * (kPointerSize / 4) * MB), 80 max_semi_space_size_(8 * (kPointerSize / 4) * MB),
81 initial_semispace_size_(Page::kPageSize), 81 initial_semispace_size_(Page::kPageSize),
82 max_old_generation_size_(700ul * (kPointerSize / 4) * MB), 82 max_old_generation_size_(700ul * (kPointerSize / 4) * MB),
83 initial_old_generation_size_(max_old_generation_size_ / 83 initial_old_generation_size_(max_old_generation_size_ /
84 kInitalOldGenerationLimitFactor), 84 kInitalOldGenerationLimitFactor),
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 break; 896 break;
897 } 897 }
898 } 898 }
899 set_current_gc_flags(kNoGCFlags); 899 set_current_gc_flags(kNoGCFlags);
900 new_space_.Shrink(); 900 new_space_.Shrink();
901 UncommitFromSpace(); 901 UncommitFromSpace();
902 } 902 }
903 903
904 904
905 void Heap::ReportExternalMemoryPressure(const char* gc_reason) { 905 void Heap::ReportExternalMemoryPressure(const char* gc_reason) {
906 if (external_memory_ >
907 (external_memory_at_last_mark_compact_ + external_memory_hard_limit())) {
908 CollectAllGarbage(
909 kReduceMemoryFootprintMask | kFinalizeIncrementalMarkingMask, gc_reason,
910 static_cast<GCCallbackFlags>(kGCCallbackFlagCollectAllAvailableGarbage |
911 kGCCallbackFlagCollectAllExternalMemory));
912 return;
913 }
906 if (incremental_marking()->IsStopped()) { 914 if (incremental_marking()->IsStopped()) {
907 if (incremental_marking()->CanBeActivated()) { 915 if (incremental_marking()->CanBeActivated()) {
908 StartIncrementalMarking( 916 StartIncrementalMarking(
909 i::Heap::kNoGCFlags, 917 i::Heap::kNoGCFlags,
910 static_cast<GCCallbackFlags>( 918 static_cast<GCCallbackFlags>(
911 kGCCallbackFlagSynchronousPhantomCallbackProcessing | 919 kGCCallbackFlagSynchronousPhantomCallbackProcessing |
912 kGCCallbackFlagCollectAllExternalMemory), 920 kGCCallbackFlagCollectAllExternalMemory),
913 gc_reason); 921 gc_reason);
914 } else { 922 } else {
915 CollectAllGarbage(i::Heap::kNoGCFlags, gc_reason, 923 CollectAllGarbage(i::Heap::kNoGCFlags, gc_reason,
916 kGCCallbackFlagSynchronousPhantomCallbackProcessing); 924 kGCCallbackFlagSynchronousPhantomCallbackProcessing);
917 } 925 }
918 } else { 926 } else {
919 // Incremental marking is turned on an has already been started. 927 // Incremental marking is turned on an has already been started.
920 928 const double pressure =
921 // TODO(mlippautz): Compute the time slice for incremental marking based on 929 static_cast<double>(external_memory_ -
922 // memory pressure. 930 external_memory_at_last_mark_compact_ -
923 double deadline = MonotonicallyIncreasingTimeInMs() + 931 kExternalAllocationSoftLimit) /
924 FLAG_external_allocation_limit_incremental_time; 932 external_memory_hard_limit();
933 DCHECK_GE(1, pressure);
934 const double kMaxStepSizeOnExternalLimit = 25;
935 const double deadline = MonotonicallyIncreasingTimeInMs() +
936 pressure * kMaxStepSizeOnExternalLimit;
925 incremental_marking()->AdvanceIncrementalMarking( 937 incremental_marking()->AdvanceIncrementalMarking(
926 deadline, 938 deadline,
927 IncrementalMarking::StepActions(IncrementalMarking::GC_VIA_STACK_GUARD, 939 IncrementalMarking::StepActions(IncrementalMarking::GC_VIA_STACK_GUARD,
928 IncrementalMarking::FORCE_MARKING, 940 IncrementalMarking::FORCE_MARKING,
929 IncrementalMarking::FORCE_COMPLETION)); 941 IncrementalMarking::FORCE_COMPLETION));
930 } 942 }
931 } 943 }
932 944
933 945
934 void Heap::EnsureFillerObjectAtTop() { 946 void Heap::EnsureFillerObjectAtTop() {
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 // Update relocatables. 1367 // Update relocatables.
1356 Relocatable::PostGarbageCollectionProcessing(isolate_); 1368 Relocatable::PostGarbageCollectionProcessing(isolate_);
1357 1369
1358 double gc_speed = tracer()->CombinedMarkCompactSpeedInBytesPerMillisecond(); 1370 double gc_speed = tracer()->CombinedMarkCompactSpeedInBytesPerMillisecond();
1359 double mutator_speed = 1371 double mutator_speed =
1360 tracer()->CurrentOldGenerationAllocationThroughputInBytesPerMillisecond(); 1372 tracer()->CurrentOldGenerationAllocationThroughputInBytesPerMillisecond();
1361 intptr_t old_gen_size = PromotedSpaceSizeOfObjects(); 1373 intptr_t old_gen_size = PromotedSpaceSizeOfObjects();
1362 if (collector == MARK_COMPACTOR) { 1374 if (collector == MARK_COMPACTOR) {
1363 // Register the amount of external allocated memory. 1375 // Register the amount of external allocated memory.
1364 external_memory_at_last_mark_compact_ = external_memory_; 1376 external_memory_at_last_mark_compact_ = external_memory_;
1365 external_memory_limit_ = external_memory_ + kExternalAllocationLimit; 1377 external_memory_limit_ = external_memory_ + kExternalAllocationSoftLimit;
1366 SetOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed); 1378 SetOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed);
1367 } else if (HasLowYoungGenerationAllocationRate() && 1379 } else if (HasLowYoungGenerationAllocationRate() &&
1368 old_generation_size_configured_) { 1380 old_generation_size_configured_) {
1369 DampenOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed); 1381 DampenOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed);
1370 } 1382 }
1371 1383
1372 { 1384 {
1373 GCCallbacksScope scope(this); 1385 GCCallbacksScope scope(this);
1374 if (scope.CheckReenter()) { 1386 if (scope.CheckReenter()) {
1375 AllowHeapAllocation allow_allocation; 1387 AllowHeapAllocation allow_allocation;
(...skipping 5134 matching lines...) Expand 10 before | Expand all | Expand 10 after
6510 } 6522 }
6511 6523
6512 6524
6513 // static 6525 // static
6514 int Heap::GetStaticVisitorIdForMap(Map* map) { 6526 int Heap::GetStaticVisitorIdForMap(Map* map) {
6515 return StaticVisitorBase::GetVisitorId(map); 6527 return StaticVisitorBase::GetVisitorId(map);
6516 } 6528 }
6517 6529
6518 } // namespace internal 6530 } // namespace internal
6519 } // namespace v8 6531 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698