| OLD | NEW |
| 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 namespace v8 { | 45 namespace v8 { |
| 46 namespace internal { | 46 namespace internal { |
| 47 | 47 |
| 48 | 48 |
| 49 struct Heap::StrongRootsList { | 49 struct Heap::StrongRootsList { |
| 50 Object** start; | 50 Object** start; |
| 51 Object** end; | 51 Object** end; |
| 52 StrongRootsList* next; | 52 StrongRootsList* next; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 class IdleScavengeObserver : public InlineAllocationObserver { |
| 56 public: |
| 57 IdleScavengeObserver(Heap& heap, intptr_t step_size) |
| 58 : InlineAllocationObserver(step_size), heap_(heap) {} |
| 59 |
| 60 virtual void Step(int bytes_allocated) { |
| 61 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated); |
| 62 } |
| 63 |
| 64 private: |
| 65 Heap& heap_; |
| 66 }; |
| 67 |
| 55 | 68 |
| 56 Heap::Heap() | 69 Heap::Heap() |
| 57 : amount_of_external_allocated_memory_(0), | 70 : amount_of_external_allocated_memory_(0), |
| 58 amount_of_external_allocated_memory_at_last_global_gc_(0), | 71 amount_of_external_allocated_memory_at_last_global_gc_(0), |
| 59 isolate_(NULL), | 72 isolate_(NULL), |
| 60 code_range_size_(0), | 73 code_range_size_(0), |
| 61 // semispace_size_ should be a power of 2 and old_generation_size_ should | 74 // semispace_size_ should be a power of 2 and old_generation_size_ should |
| 62 // be a multiple of Page::kPageSize. | 75 // be a multiple of Page::kPageSize. |
| 63 reserved_semispace_size_(8 * (kPointerSize / 4) * MB), | 76 reserved_semispace_size_(8 * (kPointerSize / 4) * MB), |
| 64 max_semi_space_size_(8 * (kPointerSize / 4) * MB), | 77 max_semi_space_size_(8 * (kPointerSize / 4) * MB), |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 last_idle_notification_time_(0.0), | 135 last_idle_notification_time_(0.0), |
| 123 last_gc_time_(0.0), | 136 last_gc_time_(0.0), |
| 124 scavenge_collector_(nullptr), | 137 scavenge_collector_(nullptr), |
| 125 mark_compact_collector_(nullptr), | 138 mark_compact_collector_(nullptr), |
| 126 store_buffer_(this), | 139 store_buffer_(this), |
| 127 incremental_marking_(nullptr), | 140 incremental_marking_(nullptr), |
| 128 gc_idle_time_handler_(nullptr), | 141 gc_idle_time_handler_(nullptr), |
| 129 memory_reducer_(nullptr), | 142 memory_reducer_(nullptr), |
| 130 object_stats_(nullptr), | 143 object_stats_(nullptr), |
| 131 scavenge_job_(nullptr), | 144 scavenge_job_(nullptr), |
| 145 idle_scavenge_observer_(nullptr), |
| 132 full_codegen_bytes_generated_(0), | 146 full_codegen_bytes_generated_(0), |
| 133 crankshaft_codegen_bytes_generated_(0), | 147 crankshaft_codegen_bytes_generated_(0), |
| 134 new_space_allocation_counter_(0), | 148 new_space_allocation_counter_(0), |
| 135 old_generation_allocation_counter_(0), | 149 old_generation_allocation_counter_(0), |
| 136 old_generation_size_at_last_gc_(0), | 150 old_generation_size_at_last_gc_(0), |
| 137 gcs_since_last_deopt_(0), | 151 gcs_since_last_deopt_(0), |
| 138 allocation_sites_scratchpad_length_(0), | 152 allocation_sites_scratchpad_length_(0), |
| 139 ring_buffer_full_(false), | 153 ring_buffer_full_(false), |
| 140 ring_buffer_end_(0), | 154 ring_buffer_end_(0), |
| 141 promotion_queue_(this), | 155 promotion_queue_(this), |
| (...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 incremental_marking()->UpdateMarkingDequeAfterScavenge(); | 1726 incremental_marking()->UpdateMarkingDequeAfterScavenge(); |
| 1713 | 1727 |
| 1714 ScavengeWeakObjectRetainer weak_object_retainer(this); | 1728 ScavengeWeakObjectRetainer weak_object_retainer(this); |
| 1715 ProcessYoungWeakReferences(&weak_object_retainer); | 1729 ProcessYoungWeakReferences(&weak_object_retainer); |
| 1716 | 1730 |
| 1717 DCHECK(new_space_front == new_space_.top()); | 1731 DCHECK(new_space_front == new_space_.top()); |
| 1718 | 1732 |
| 1719 // Set age mark. | 1733 // Set age mark. |
| 1720 new_space_.set_age_mark(new_space_.top()); | 1734 new_space_.set_age_mark(new_space_.top()); |
| 1721 | 1735 |
| 1722 new_space_.LowerInlineAllocationLimit( | 1736 // We start a new step without accounting the objects copied into to space |
| 1723 new_space_.inline_allocation_limit_step()); | 1737 // as those are not allocations. |
| 1738 new_space_.UpdateInlineAllocationLimitStep(); |
| 1724 | 1739 |
| 1725 array_buffer_tracker()->FreeDead(true); | 1740 array_buffer_tracker()->FreeDead(true); |
| 1726 | 1741 |
| 1727 // Update how much has survived scavenge. | 1742 // Update how much has survived scavenge. |
| 1728 IncrementYoungSurvivorsCounter(static_cast<int>( | 1743 IncrementYoungSurvivorsCounter(static_cast<int>( |
| 1729 (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size())); | 1744 (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size())); |
| 1730 | 1745 |
| 1731 LOG(isolate_, ResourceEvent("scavenge", "end")); | 1746 LOG(isolate_, ResourceEvent("scavenge", "end")); |
| 1732 | 1747 |
| 1733 gc_state_ = NOT_IN_GC; | 1748 gc_state_ = NOT_IN_GC; |
| (...skipping 3296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5030 | 5045 |
| 5031 // Update inline allocation limit for old spaces. | 5046 // Update inline allocation limit for old spaces. |
| 5032 PagedSpaces spaces(this); | 5047 PagedSpaces spaces(this); |
| 5033 for (PagedSpace* space = spaces.next(); space != NULL; | 5048 for (PagedSpace* space = spaces.next(); space != NULL; |
| 5034 space = spaces.next()) { | 5049 space = spaces.next()) { |
| 5035 space->EmptyAllocationInfo(); | 5050 space->EmptyAllocationInfo(); |
| 5036 } | 5051 } |
| 5037 } | 5052 } |
| 5038 | 5053 |
| 5039 | 5054 |
| 5040 void Heap::LowerInlineAllocationLimit(intptr_t step) { | |
| 5041 new_space()->LowerInlineAllocationLimit(step); | |
| 5042 } | |
| 5043 | |
| 5044 | |
| 5045 void Heap::ResetInlineAllocationLimit() { | |
| 5046 new_space()->LowerInlineAllocationLimit( | |
| 5047 ScavengeJob::kBytesAllocatedBeforeNextIdleTask); | |
| 5048 } | |
| 5049 | |
| 5050 | |
| 5051 V8_DECLARE_ONCE(initialize_gc_once); | 5055 V8_DECLARE_ONCE(initialize_gc_once); |
| 5052 | 5056 |
| 5053 static void InitializeGCOnce() { | 5057 static void InitializeGCOnce() { |
| 5054 Scavenger::Initialize(); | 5058 Scavenger::Initialize(); |
| 5055 StaticScavengeVisitor::Initialize(); | 5059 StaticScavengeVisitor::Initialize(); |
| 5056 MarkCompactCollector::Initialize(); | 5060 MarkCompactCollector::Initialize(); |
| 5057 } | 5061 } |
| 5058 | 5062 |
| 5059 | 5063 |
| 5060 bool Heap::SetUp() { | 5064 bool Heap::SetUp() { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5149 | 5153 |
| 5150 array_buffer_tracker_ = new ArrayBufferTracker(this); | 5154 array_buffer_tracker_ = new ArrayBufferTracker(this); |
| 5151 | 5155 |
| 5152 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); | 5156 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); |
| 5153 LOG(isolate_, IntPtrTEvent("heap-available", Available())); | 5157 LOG(isolate_, IntPtrTEvent("heap-available", Available())); |
| 5154 | 5158 |
| 5155 store_buffer()->SetUp(); | 5159 store_buffer()->SetUp(); |
| 5156 | 5160 |
| 5157 mark_compact_collector()->SetUp(); | 5161 mark_compact_collector()->SetUp(); |
| 5158 | 5162 |
| 5159 ResetInlineAllocationLimit(); | 5163 idle_scavenge_observer_ = new IdleScavengeObserver( |
| 5164 *this, ScavengeJob::kBytesAllocatedBeforeNextIdleTask); |
| 5165 new_space()->AddInlineAllocationObserver(idle_scavenge_observer_); |
| 5160 | 5166 |
| 5161 return true; | 5167 return true; |
| 5162 } | 5168 } |
| 5163 | 5169 |
| 5164 | 5170 |
| 5165 bool Heap::CreateHeapObjects() { | 5171 bool Heap::CreateHeapObjects() { |
| 5166 // Create initial maps. | 5172 // Create initial maps. |
| 5167 if (!CreateInitialMaps()) return false; | 5173 if (!CreateInitialMaps()) return false; |
| 5168 CreateApiObjects(); | 5174 CreateApiObjects(); |
| 5169 | 5175 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5248 map_space_->MaximumCommittedMemory()); | 5254 map_space_->MaximumCommittedMemory()); |
| 5249 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", | 5255 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", |
| 5250 lo_space_->MaximumCommittedMemory()); | 5256 lo_space_->MaximumCommittedMemory()); |
| 5251 PrintF("\n\n"); | 5257 PrintF("\n\n"); |
| 5252 } | 5258 } |
| 5253 | 5259 |
| 5254 if (FLAG_verify_predictable) { | 5260 if (FLAG_verify_predictable) { |
| 5255 PrintAlloctionsHash(); | 5261 PrintAlloctionsHash(); |
| 5256 } | 5262 } |
| 5257 | 5263 |
| 5264 new_space()->RemoveInlineAllocationObserver(idle_scavenge_observer_); |
| 5265 delete idle_scavenge_observer_; |
| 5266 idle_scavenge_observer_ = nullptr; |
| 5267 |
| 5258 delete scavenge_collector_; | 5268 delete scavenge_collector_; |
| 5259 scavenge_collector_ = nullptr; | 5269 scavenge_collector_ = nullptr; |
| 5260 | 5270 |
| 5261 if (mark_compact_collector_ != nullptr) { | 5271 if (mark_compact_collector_ != nullptr) { |
| 5262 mark_compact_collector_->TearDown(); | 5272 mark_compact_collector_->TearDown(); |
| 5263 delete mark_compact_collector_; | 5273 delete mark_compact_collector_; |
| 5264 mark_compact_collector_ = nullptr; | 5274 mark_compact_collector_ = nullptr; |
| 5265 } | 5275 } |
| 5266 | 5276 |
| 5267 delete incremental_marking_; | 5277 delete incremental_marking_; |
| (...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6186 } | 6196 } |
| 6187 | 6197 |
| 6188 | 6198 |
| 6189 // static | 6199 // static |
| 6190 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6200 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6191 return StaticVisitorBase::GetVisitorId(map); | 6201 return StaticVisitorBase::GetVisitorId(map); |
| 6192 } | 6202 } |
| 6193 | 6203 |
| 6194 } // namespace internal | 6204 } // namespace internal |
| 6195 } // namespace v8 | 6205 } // namespace v8 |
| OLD | NEW |