v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
heap.cc
Go to the documentation of this file.
1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
20
21namespace cppgc {
22
23namespace {
24
25void VerifyCustomSpaces(
26 const std::vector<std::unique_ptr<CustomSpaceBase>>& custom_spaces) {
27 // Ensures that user-provided custom spaces have indices that form a sequence
28 // starting at 0.
29#ifdef DEBUG
30 for (size_t i = 0; i < custom_spaces.size(); ++i) {
31 DCHECK_EQ(i, custom_spaces[i]->GetCustomSpaceIndex().value);
32 }
33#endif // DEBUG
34}
35
36} // namespace
37
38std::unique_ptr<Heap> Heap::Create(std::shared_ptr<cppgc::Platform> platform,
40 DCHECK(platform.get());
41 VerifyCustomSpaces(options.custom_spaces);
42 return std::make_unique<internal::Heap>(std::move(platform),
43 std::move(options));
44}
45
46void Heap::ForceGarbageCollectionSlow(const char* source, const char* reason,
47 Heap::StackState stack_state) {
51 internal::GCConfig::FreeMemoryHandling::kDiscardWherePossible,
52 internal::GCConfig::IsForcedGC::kForced});
53}
54
58
60
61namespace internal {
62
63namespace {
64
65void CheckConfig(GCConfig config, HeapBase::MarkingType marking_support,
66 HeapBase::SweepingType sweeping_support) {
67 CHECK_LE(static_cast<int>(config.marking_type),
68 static_cast<int>(marking_support));
69 CHECK_LE(static_cast<int>(config.sweeping_type),
70 static_cast<int>(sweeping_support));
71}
72
73} // namespace
74
75Heap::Heap(std::shared_ptr<cppgc::Platform> platform,
77 : HeapBase(platform, options.custom_spaces, options.stack_support,
78 options.marking_support, options.sweeping_support, gc_invoker_),
79 gc_invoker_(this, platform_.get(), options.stack_support),
80 growing_(&gc_invoker_, stats_collector_.get(),
81 options.resource_constraints, options.marking_support,
82 options.sweeping_support) {
83 CHECK_IMPLIES(options.marking_support != HeapBase::MarkingType::kAtomic,
85 CHECK_IMPLIES(options.sweeping_support != HeapBase::SweepingType::kAtomic,
87#ifdef V8_ENABLE_ALLOCATION_TIMEOUT
88 object_allocator().UpdateAllocationTimeout();
89#endif // V8_ENABLE_ALLOCATION_TIMEOUT
90}
91
93 // Gracefully finish already running GC if any, but don't finalize live
94 // objects.
96 {CollectionType::kMajor, StackState::kMayContainHeapPointers,
97 GCConfig::MarkingType::kAtomic, GCConfig::SweepingType::kAtomic});
98 {
101 }
102}
103
105 DCHECK_EQ(GCConfig::MarkingType::kAtomic, config.marking_type);
106 CheckConfig(config, marking_support_, sweeping_support_);
107
108 if (!IsGCAllowed()) {
109 return;
110 }
111
112 config_ = config;
113
114 if (!IsMarking()) {
116 }
117 DCHECK(IsMarking());
119}
120
122 DCHECK_NE(GCConfig::MarkingType::kAtomic, config.marking_type);
123 DCHECK_NE(marking_support_, GCConfig::MarkingType::kAtomic);
124 CheckConfig(config, marking_support_, sweeping_support_);
125
126 if (IsMarking() || in_no_gc_scope()) return;
127
128 config_ = config;
129
131}
132
134 CheckConfig(config, marking_support_, sweeping_support_);
135
136 if (!IsMarking()) return;
137
139
140 DCHECK_NE(GCConfig::MarkingType::kAtomic, config_.marking_type);
141 config_ = config;
143}
144
146 DCHECK(!IsMarking());
148
149 // Finish sweeping in case it is still running.
151
152 epoch_++;
153
154#if defined(CPPGC_YOUNG_GENERATION)
159 stats_collector(), cppgc::internal::StatsCollector::kUnmark);
160 SequentialUnmarker unmarker(raw_heap());
161 }
162#endif // defined(CPPGC_YOUNG_GENERATION)
163
164 const MarkingConfig marking_config{config.collection_type, config.stack_state,
165 config.marking_type, config.is_forced_gc};
166 marker_ = std::make_unique<Marker>(AsBase(), platform_.get(), marking_config);
167 marker_->StartMarking();
168}
169
172 [this, stack_state]() { FinalizeGarbageCollectionImpl(stack_state); });
173}
174
176 DCHECK(IsMarking());
179 config_.stack_state = stack_state;
180 in_atomic_pause_ = true;
181
182#if defined(CPPGC_YOUNG_GENERATION)
183 // Check if the young generation was enabled. We must enable young generation
184 // before calling the custom weak callbacks to make sure that the callbacks
185 // for old objects are registered in the remembered set.
187 HeapBase::EnableGenerationalGC();
188 }
189#endif // defined(CPPGC_YOUNG_GENERATION)
190 {
191 // This guards atomic pause marking, meaning that no internal method or
192 // external callbacks are allowed to allocate new objects.
194 marker_->FinishMarking(config_.stack_state);
195 }
196 marker_.reset();
197 const size_t bytes_allocated_in_prefinalizers = ExecutePreFinalizers();
198#if CPPGC_VERIFY_HEAP
199 MarkingVerifier verifier(*this, config_.collection_type);
200 verifier.Run(config_.stack_state,
201 stats_collector()->marked_bytes_on_current_cycle() +
202 bytes_allocated_in_prefinalizers);
203#endif // CPPGC_VERIFY_HEAP
204#ifndef CPPGC_ALLOW_ALLOCATIONS_IN_PREFINALIZERS
205 DCHECK_EQ(0u, bytes_allocated_in_prefinalizers);
206#endif
207 USE(bytes_allocated_in_prefinalizers);
208
209#if defined(CPPGC_YOUNG_GENERATION)
210 ResetRememberedSet();
211#endif // defined(CPPGC_YOUNG_GENERATION)
212
214 const SweepingConfig sweeping_config{
217 sweeper_.Start(sweeping_config);
218 if (config_.sweeping_type == SweepingConfig::SweepingType::kAtomic) {
220 }
221 in_atomic_pause_ = false;
222}
223
229
231
233 StackState stack_state) {
235 stats_collector(), StatsCollector::kMarkIncrementalFinalize);
236 FinalizeGarbageCollection(stack_state);
237}
238
240 DCHECK(!IsMarking());
242 StartGarbageCollection({CollectionType::kMajor, StackState::kNoHeapPointers,
243 GCConfig::MarkingType::kIncrementalAndConcurrent,
244 GCConfig::SweepingType::kIncrementalAndConcurrent});
245}
246
254
255} // namespace internal
256} // namespace cppgc
HeapHandle & GetHeapHandle()
Definition heap.cc:59
void ForceGarbageCollectionSlow(const char *source, const char *reason, StackState stack_state=StackState::kMayContainHeapPointers)
Definition heap.cc:46
AllocationHandle & GetAllocationHandle()
Definition heap.cc:55
static std::unique_ptr< Heap > Create(std::shared_ptr< Platform > platform, HeapOptions options=HeapOptions::Default())
Definition heap.cc:38
virtual std::shared_ptr< TaskRunner > GetForegroundTaskRunner()
Definition platform.h:54
SweepingType sweeping_support_
Definition heap-base.h:338
cppgc::Heap::SweepingType SweepingType
Definition heap-base.h:86
cppgc::Heap::MarkingType MarkingType
Definition heap-base.h:85
std::shared_ptr< cppgc::Platform > platform_
Definition heap-base.h:295
bool generational_gc_supported() const
Definition heap-base.h:218
friend class cppgc::testing::Heap
Definition heap-base.h:347
StatsCollector * stats_collector()
Definition heap-base.h:118
virtual bool IsGCForbidden() const
Definition heap-base.cc:343
virtual bool IsGCAllowed() const
Definition heap-base.cc:345
std::unique_ptr< MarkerBase > marker_
Definition heap-base.h:310
MarkingType marking_support_
Definition heap-base.h:337
virtual heap::base::Stack * stack()
Definition heap-base.h:174
ObjectAllocator & object_allocator()
Definition heap-base.h:135
bool in_no_gc_scope() const
Definition heap-base.h:276
void FinalizeIncrementalGarbageCollectionForTesting(EmbedderStackState) final
Definition heap.cc:247
void CollectGarbage(GCConfig) final
Definition heap.cc:104
void StartIncrementalGarbageCollection(GCConfig) final
Definition heap.cc:121
void StartIncrementalGarbageCollectionForTesting() final
Definition heap.cc:239
static Heap * From(cppgc::Heap *heap)
Definition heap.h:25
void FinalizeGarbageCollection(StackState)
Definition heap.cc:170
void EnableGenerationalGC()
Definition heap.cc:224
void FinalizeIncrementalGarbageCollectionIfRunning(GCConfig)
Definition heap.cc:133
void FinalizeGarbageCollectionImpl(StackState)
Definition heap.cc:175
void FinalizeIncrementalGarbageCollectionIfNeeded(StackState) final
Definition heap.cc:232
void DisableHeapGrowingForTesting()
Definition heap.cc:230
HeapGrowing growing_
Definition heap.h:72
bool generational_gc_enabled_
Definition heap.h:73
HeapBase & AsBase()
Definition heap.h:34
void StartGarbageCollection(GCConfig)
Definition heap.cc:145
GCConfig config_
Definition heap.h:70
void Run(StackState, std::optional< size_t >)
void NotifyUnmarkingStarted(CollectionType)
void Start(SweepingConfig)
Definition sweeper.cc:1661
V8_INLINE void SetMarkerIfNeededAndCallback(Callback callback)
Definition stack.h:74
v8::Platform * platform_
Definition cpp-heap.cc:193
StatsCollector * stats_collector_
Definition sweeper.cc:595
EmbedderStackState
Definition common.h:15
#define CHECK_IMPLIES(lhs, rhs)
#define CHECK(condition)
Definition logging.h:124
#define CHECK_LE(lhs, rhs)
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define USE(...)
Definition macros.h:293
CollectionType collection_type
FreeMemoryHandling free_memory_handling