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/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 4049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4060 Struct* result = nullptr; | 4060 Struct* result = nullptr; |
4061 { | 4061 { |
4062 AllocationResult allocation = Allocate(map, OLD_SPACE); | 4062 AllocationResult allocation = Allocate(map, OLD_SPACE); |
4063 if (!allocation.To(&result)) return allocation; | 4063 if (!allocation.To(&result)) return allocation; |
4064 } | 4064 } |
4065 result->InitializeBody(size); | 4065 result->InitializeBody(size); |
4066 return result; | 4066 return result; |
4067 } | 4067 } |
4068 | 4068 |
4069 | 4069 |
4070 bool Heap::IsHeapIterable() { | |
4071 // TODO(hpayer): This function is not correct. Allocation folding in old | |
4072 // space breaks the iterability. | |
4073 return new_space_top_after_last_gc_ == new_space()->top(); | |
4074 } | |
4075 | |
4076 | |
4077 void Heap::MakeHeapIterable() { | 4070 void Heap::MakeHeapIterable() { |
Hannes Payer (out of office)
2017/02/10 07:37:18
FYI: We do not need to wait for sweepers to make t
| |
4078 DCHECK(AllowHeapAllocation::IsAllowed()); | |
4079 if (!IsHeapIterable()) { | |
4080 CollectAllGarbage(kMakeHeapIterableMask, | |
4081 GarbageCollectionReason::kMakeHeapIterable); | |
4082 } | |
4083 mark_compact_collector()->EnsureSweepingCompleted(); | 4071 mark_compact_collector()->EnsureSweepingCompleted(); |
4084 DCHECK(IsHeapIterable()); | |
4085 } | 4072 } |
4086 | 4073 |
4087 | 4074 |
4088 static double ComputeMutatorUtilization(double mutator_speed, double gc_speed) { | 4075 static double ComputeMutatorUtilization(double mutator_speed, double gc_speed) { |
4089 const double kMinMutatorUtilization = 0.0; | 4076 const double kMinMutatorUtilization = 0.0; |
4090 const double kConservativeGcSpeedInBytesPerMillisecond = 200000; | 4077 const double kConservativeGcSpeedInBytesPerMillisecond = 200000; |
4091 if (mutator_speed == 0) return kMinMutatorUtilization; | 4078 if (mutator_speed == 0) return kMinMutatorUtilization; |
4092 if (gc_speed == 0) gc_speed = kConservativeGcSpeedInBytesPerMillisecond; | 4079 if (gc_speed == 0) gc_speed = kConservativeGcSpeedInBytesPerMillisecond; |
4093 // Derivation: | 4080 // Derivation: |
4094 // mutator_utilization = mutator_time / (mutator_time + gc_time) | 4081 // mutator_utilization = mutator_time / (mutator_time + gc_time) |
(...skipping 2015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6110 void MarkReachableObjects() { | 6097 void MarkReachableObjects() { |
6111 MarkingVisitor visitor; | 6098 MarkingVisitor visitor; |
6112 heap_->IterateRoots(&visitor, VISIT_ALL); | 6099 heap_->IterateRoots(&visitor, VISIT_ALL); |
6113 visitor.TransitiveClosure(); | 6100 visitor.TransitiveClosure(); |
6114 } | 6101 } |
6115 | 6102 |
6116 Heap* heap_; | 6103 Heap* heap_; |
6117 DisallowHeapAllocation no_allocation_; | 6104 DisallowHeapAllocation no_allocation_; |
6118 }; | 6105 }; |
6119 | 6106 |
6120 | |
6121 HeapIterator::HeapIterator(Heap* heap, | 6107 HeapIterator::HeapIterator(Heap* heap, |
6122 HeapIterator::HeapObjectsFiltering filtering) | 6108 HeapIterator::HeapObjectsFiltering filtering) |
6123 : make_heap_iterable_helper_(heap), | 6109 : no_heap_allocation_(), |
6124 no_heap_allocation_(), | |
6125 heap_(heap), | 6110 heap_(heap), |
6126 filtering_(filtering), | 6111 filtering_(filtering), |
6127 filter_(nullptr), | 6112 filter_(nullptr), |
6128 space_iterator_(nullptr), | 6113 space_iterator_(nullptr), |
6129 object_iterator_(nullptr) { | 6114 object_iterator_(nullptr) { |
6115 heap_->MakeHeapIterable(); | |
6130 heap_->heap_iterator_start(); | 6116 heap_->heap_iterator_start(); |
6131 // Start the iteration. | 6117 // Start the iteration. |
6132 space_iterator_ = new SpaceIterator(heap_); | 6118 space_iterator_ = new SpaceIterator(heap_); |
6133 switch (filtering_) { | 6119 switch (filtering_) { |
6134 case kFilterUnreachable: | 6120 case kFilterUnreachable: |
6135 filter_ = new UnreachableObjectsFilter(heap_); | 6121 filter_ = new UnreachableObjectsFilter(heap_); |
6136 break; | 6122 break; |
6137 default: | 6123 default: |
6138 break; | 6124 break; |
6139 } | 6125 } |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6553 } | 6539 } |
6554 | 6540 |
6555 | 6541 |
6556 // static | 6542 // static |
6557 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6543 int Heap::GetStaticVisitorIdForMap(Map* map) { |
6558 return StaticVisitorBase::GetVisitorId(map); | 6544 return StaticVisitorBase::GetVisitorId(map); |
6559 } | 6545 } |
6560 | 6546 |
6561 } // namespace internal | 6547 } // namespace internal |
6562 } // namespace v8 | 6548 } // namespace v8 |
OLD | NEW |