Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 0d753e2227654db5244900aeb958802cf242201e..50e1efc15039e284039c6e85e8390a57348aa256 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -162,7 +162,8 @@ Heap::Heap() |
deserialization_complete_(false), |
strong_roots_list_(NULL), |
heap_iterator_depth_(0), |
- force_oom_(false) { |
+ force_oom_(false), |
+ array_buffer_tracker_(nullptr) { |
// Allow build-time customization of the max semispace size. Building |
// V8 with snapshots and a non-default max semispace size is much |
// easier if you can define it as part of the build environment. |
@@ -312,6 +313,21 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space, |
return SCAVENGER; |
} |
+size_t Heap::external_memory_retained_from_new_space() { |
+ // This is just an approximation. |
+ return array_buffer_tracker()->retained_from_new_space(); |
+} |
+ |
+bool Heap::ShouldDoScavengeForReducingExternalMemory() { |
+ size_t retained_new_space = external_memory_retained_from_new_space(); |
+ size_t retained_old_space = external_memory() - retained_new_space; |
+ float new_space_ratio = |
+ static_cast<float>(new_space_.SizeOfObjects()) / retained_new_space; |
+ float old_space_ratio = |
+ static_cast<float>(old_space_->SizeOfObjects()) / retained_old_space; |
+ // TODO(mlippautz): Add some lower bound. |
+ return new_space_ratio > old_space_ratio; |
+} |
// TODO(1238405): Combine the infrastructure for --heap-stats and |
// --log-gc to avoid the complicated preprocessor and flag testing. |
@@ -1716,7 +1732,7 @@ void Heap::Scavenge() { |
// Set age mark. |
new_space_.set_age_mark(new_space_.top()); |
- ArrayBufferTracker::FreeDeadInNewSpace(this); |
+ array_buffer_tracker()->FreeDeadInNewSpace(); |
// Update how much has survived scavenge. |
IncrementYoungSurvivorsCounter(static_cast<int>( |
@@ -2002,12 +2018,12 @@ HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { |
void Heap::RegisterNewArrayBuffer(JSArrayBuffer* buffer) { |
- ArrayBufferTracker::RegisterNew(this, buffer); |
+ array_buffer_tracker()->RegisterNew(buffer); |
} |
void Heap::UnregisterArrayBuffer(JSArrayBuffer* buffer) { |
- ArrayBufferTracker::Unregister(this, buffer); |
+ array_buffer_tracker()->Unregister(buffer); |
} |
@@ -5358,6 +5374,8 @@ bool Heap::SetUp() { |
*this, ScavengeJob::kBytesAllocatedBeforeNextIdleTask); |
new_space()->AddAllocationObserver(idle_scavenge_observer_); |
+ array_buffer_tracker_ = new ArrayBufferTracker(this); |
+ |
return true; |
} |
@@ -5558,6 +5576,9 @@ void Heap::TearDown() { |
delete store_buffer_; |
store_buffer_ = nullptr; |
+ delete array_buffer_tracker_; |
+ array_buffer_tracker_ = nullptr; |
+ |
delete memory_allocator_; |
memory_allocator_ = nullptr; |
} |