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/ast/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 namespace v8 { | 46 namespace v8 { |
47 namespace internal { | 47 namespace internal { |
48 | 48 |
49 | 49 |
50 struct Heap::StrongRootsList { | 50 struct Heap::StrongRootsList { |
51 Object** start; | 51 Object** start; |
52 Object** end; | 52 Object** end; |
53 StrongRootsList* next; | 53 StrongRootsList* next; |
54 }; | 54 }; |
55 | 55 |
56 class IdleScavengeObserver : public InlineAllocationObserver { | 56 class IdleScavengeObserver : public AllocationObserver { |
57 public: | 57 public: |
58 IdleScavengeObserver(Heap& heap, intptr_t step_size) | 58 IdleScavengeObserver(Heap& heap, intptr_t step_size) |
59 : InlineAllocationObserver(step_size), heap_(heap) {} | 59 : AllocationObserver(step_size), heap_(heap) {} |
60 | 60 |
61 void Step(int bytes_allocated, Address, size_t) override { | 61 void Step(int bytes_allocated, Address, size_t) override { |
62 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated); | 62 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated); |
63 } | 63 } |
64 | 64 |
65 private: | 65 private: |
66 Heap& heap_; | 66 Heap& heap_; |
67 }; | 67 }; |
68 | 68 |
69 | 69 |
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 } else { | 1415 } else { |
1416 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | 1416 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); |
1417 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags); | 1417 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags); |
1418 } | 1418 } |
1419 } | 1419 } |
1420 } | 1420 } |
1421 } | 1421 } |
1422 | 1422 |
1423 | 1423 |
1424 void Heap::MarkCompact() { | 1424 void Heap::MarkCompact() { |
1425 PauseInlineAllocationObserversScope pause_observers(new_space()); | 1425 PauseAllocationObserversScope pause_observers(this); |
1426 | 1426 |
1427 gc_state_ = MARK_COMPACT; | 1427 gc_state_ = MARK_COMPACT; |
1428 LOG(isolate_, ResourceEvent("markcompact", "begin")); | 1428 LOG(isolate_, ResourceEvent("markcompact", "begin")); |
1429 | 1429 |
1430 uint64_t size_of_objects_before_gc = SizeOfObjects(); | 1430 uint64_t size_of_objects_before_gc = SizeOfObjects(); |
1431 | 1431 |
1432 mark_compact_collector()->Prepare(); | 1432 mark_compact_collector()->Prepare(); |
1433 | 1433 |
1434 ms_count_++; | 1434 ms_count_++; |
1435 | 1435 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1622 void Heap::Scavenge() { | 1622 void Heap::Scavenge() { |
1623 GCTracer::Scope gc_scope(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE); | 1623 GCTracer::Scope gc_scope(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE); |
1624 RelocationLock relocation_lock(this); | 1624 RelocationLock relocation_lock(this); |
1625 // There are soft limits in the allocation code, designed to trigger a mark | 1625 // There are soft limits in the allocation code, designed to trigger a mark |
1626 // sweep collection by failing allocations. There is no sense in trying to | 1626 // sweep collection by failing allocations. There is no sense in trying to |
1627 // trigger one during scavenge: scavenges allocation should always succeed. | 1627 // trigger one during scavenge: scavenges allocation should always succeed. |
1628 AlwaysAllocateScope scope(isolate()); | 1628 AlwaysAllocateScope scope(isolate()); |
1629 | 1629 |
1630 // Bump-pointer allocations done during scavenge are not real allocations. | 1630 // Bump-pointer allocations done during scavenge are not real allocations. |
1631 // Pause the inline allocation steps. | 1631 // Pause the inline allocation steps. |
1632 PauseInlineAllocationObserversScope pause_observers(new_space()); | 1632 PauseAllocationObserversScope pause_observers(this); |
1633 | 1633 |
1634 #ifdef VERIFY_HEAP | 1634 #ifdef VERIFY_HEAP |
1635 if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this); | 1635 if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this); |
1636 #endif | 1636 #endif |
1637 | 1637 |
1638 gc_state_ = SCAVENGE; | 1638 gc_state_ = SCAVENGE; |
1639 | 1639 |
1640 // Implements Cheney's copying algorithm | 1640 // Implements Cheney's copying algorithm |
1641 LOG(isolate_, ResourceEvent("scavenge", "begin")); | 1641 LOG(isolate_, ResourceEvent("scavenge", "begin")); |
1642 | 1642 |
(...skipping 3497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5140 | 5140 |
5141 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); | 5141 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); |
5142 LOG(isolate_, IntPtrTEvent("heap-available", Available())); | 5142 LOG(isolate_, IntPtrTEvent("heap-available", Available())); |
5143 | 5143 |
5144 store_buffer()->SetUp(); | 5144 store_buffer()->SetUp(); |
5145 | 5145 |
5146 mark_compact_collector()->SetUp(); | 5146 mark_compact_collector()->SetUp(); |
5147 | 5147 |
5148 idle_scavenge_observer_ = new IdleScavengeObserver( | 5148 idle_scavenge_observer_ = new IdleScavengeObserver( |
5149 *this, ScavengeJob::kBytesAllocatedBeforeNextIdleTask); | 5149 *this, ScavengeJob::kBytesAllocatedBeforeNextIdleTask); |
5150 new_space()->AddInlineAllocationObserver(idle_scavenge_observer_); | 5150 new_space()->AddAllocationObserver(idle_scavenge_observer_); |
5151 | 5151 |
5152 return true; | 5152 return true; |
5153 } | 5153 } |
5154 | 5154 |
5155 | 5155 |
5156 bool Heap::CreateHeapObjects() { | 5156 bool Heap::CreateHeapObjects() { |
5157 // Create initial maps. | 5157 // Create initial maps. |
5158 if (!CreateInitialMaps()) return false; | 5158 if (!CreateInitialMaps()) return false; |
5159 CreateApiObjects(); | 5159 CreateApiObjects(); |
5160 | 5160 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5240 map_space_->MaximumCommittedMemory()); | 5240 map_space_->MaximumCommittedMemory()); |
5241 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", | 5241 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", |
5242 lo_space_->MaximumCommittedMemory()); | 5242 lo_space_->MaximumCommittedMemory()); |
5243 PrintF("\n\n"); | 5243 PrintF("\n\n"); |
5244 } | 5244 } |
5245 | 5245 |
5246 if (FLAG_verify_predictable) { | 5246 if (FLAG_verify_predictable) { |
5247 PrintAlloctionsHash(); | 5247 PrintAlloctionsHash(); |
5248 } | 5248 } |
5249 | 5249 |
5250 new_space()->RemoveInlineAllocationObserver(idle_scavenge_observer_); | 5250 new_space()->RemoveAllocationObserver(idle_scavenge_observer_); |
5251 delete idle_scavenge_observer_; | 5251 delete idle_scavenge_observer_; |
5252 idle_scavenge_observer_ = nullptr; | 5252 idle_scavenge_observer_ = nullptr; |
5253 | 5253 |
5254 delete scavenge_collector_; | 5254 delete scavenge_collector_; |
5255 scavenge_collector_ = nullptr; | 5255 scavenge_collector_ = nullptr; |
5256 | 5256 |
5257 if (mark_compact_collector_ != nullptr) { | 5257 if (mark_compact_collector_ != nullptr) { |
5258 mark_compact_collector_->TearDown(); | 5258 mark_compact_collector_->TearDown(); |
5259 delete mark_compact_collector_; | 5259 delete mark_compact_collector_; |
5260 mark_compact_collector_ = nullptr; | 5260 mark_compact_collector_ = nullptr; |
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6222 } | 6222 } |
6223 | 6223 |
6224 | 6224 |
6225 // static | 6225 // static |
6226 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6226 int Heap::GetStaticVisitorIdForMap(Map* map) { |
6227 return StaticVisitorBase::GetVisitorId(map); | 6227 return StaticVisitorBase::GetVisitorId(map); |
6228 } | 6228 } |
6229 | 6229 |
6230 } // namespace internal | 6230 } // namespace internal |
6231 } // namespace v8 | 6231 } // namespace v8 |
OLD | NEW |