v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
minor-mark-sweep.h
Go to the documentation of this file.
1// Copyright 2023 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
5#ifndef V8_HEAP_MINOR_MARK_SWEEP_H_
6#define V8_HEAP_MINOR_MARK_SWEEP_H_
7
8#include <atomic>
9#include <memory>
10#include <optional>
11#include <vector>
12
13#include "src/base/macros.h"
14#include "src/common/globals.h"
15#include "src/heap/heap.h"
21#include "src/heap/slot-set.h"
22#include "src/heap/sweeper.h"
24
25namespace v8 {
26namespace internal {
27
28class MinorMarkSweepCollector;
29
32
34 private:
35 class MarkingItem;
36
37 public:
38 class Local {
39 public:
41 : handler_(handler) {}
42
43 template <typename Visitor>
44 bool ProcessNextItem(Visitor* visitor) {
45 return handler_->ProcessNextItem(visitor, index_);
46 }
47
48 private:
50 std::optional<size_t> index_;
51 };
52
53 static std::vector<MarkingItem> CollectItems(Heap* heap);
54
57
60 std::memory_order_relaxed);
61 }
62
63 void TearDown();
64
65 private:
67 public:
69
71 SlotSet* slot_set, SlotSet* background_slot_set)
72 : chunk_(chunk),
73 slots_type_(slots_type),
74 slot_set_(slot_set),
75 background_slot_set_(background_slot_set) {}
77 TypedSlotSet* typed_slot_set)
78 : chunk_(chunk),
79 slots_type_(slots_type),
80 typed_slot_set_(typed_slot_set) {}
81 ~MarkingItem() = default;
82
83 template <typename Visitor>
84 void Process(Visitor* visitor);
87
89
90 private:
91 inline Heap* heap() { return chunk_->heap(); }
92
93 template <typename Visitor>
94 void MarkUntypedPointers(Visitor* visitor);
95 template <typename Visitor>
96 void MarkTypedPointers(Visitor* visitor);
97 template <typename Visitor, typename TSlot>
98 V8_INLINE SlotCallbackResult CheckAndMarkObject(Visitor* visitor,
99 TSlot slot);
100
103 union {
106 };
108 };
109
110 template <typename Visitor>
111 bool ProcessNextItem(Visitor* visitor, std::optional<size_t>& index);
112
113 std::vector<MarkingItem> remembered_sets_marking_items_;
116};
117
119 public:
123
124 V8_INLINE void VisitRootPointer(Root root, const char* description,
125 FullObjectSlot p) final;
126
127 V8_INLINE void VisitRootPointers(Root root, const char* description,
129 FullObjectSlot end) final;
130
134
136 delete;
138 const YoungGenerationRootMarkingVisitor&) = delete;
139
140 private:
141 template <typename TSlot>
142 void VisitPointersImpl(Root root, TSlot start, TSlot end);
143
145};
146
147// Collector for young-generation only.
149 public:
150 static constexpr size_t kMaxParallelTasks = 8;
151
154
155 void TearDown();
156 void CollectGarbage();
157 void StartMarking(bool force_use_background_threads);
158
159 void RequestGC();
160
164
166
168 return &main_marking_visitor_->marking_worklists_local();
169 }
170
176
180
181 bool is_in_atomic_pause() const {
182 return is_in_atomic_pause_.load(std::memory_order_relaxed);
183 }
184
186 return gc_finalization_requested_.load(std::memory_order_relaxed);
187 }
188
191 }
192
194
195 private:
196 using ResizeNewSpaceMode = Heap::ResizeNewSpaceMode;
197
198 class RootMarkingVisitor;
199
200 Sweeper* sweeper() { return sweeper_; }
201
202 void MarkLiveObjects();
204 bool was_marked_incrementally);
211
212 void TraceFragmentation();
215 // Perform Wrapper Tracing if in use.
217
218 void Sweep();
219 // 'StartSweepNewSpace' and 'SweepNewLargeSpace' return true if any pages were
220 // promoted.
221 bool StartSweepNewSpace();
223 bool SweepNewLargeSpace();
224
225 void Finish();
226
227 Heap* const heap_;
228
229 std::unique_ptr<MarkingWorklists> marking_worklists_;
230
231 std::unique_ptr<EphemeronRememberedSet::TableList> ephemeron_table_list_;
232 std::unique_ptr<YoungGenerationMainMarkingVisitor> main_marking_visitor_;
233
237
238 std::unique_ptr<PretenuringHandler::PretenuringFeedbackMap>
240
241 std::unique_ptr<YoungGenerationRememberedSetsMarkingWorklist>
243
245
246 std::atomic<bool> is_in_atomic_pause_{false};
247 std::atomic<bool> gc_finalization_requested_{false};
248
249 friend class IncrementalMarking;
250};
251
252} // namespace internal
253} // namespace v8
254
255#endif // V8_HEAP_MINOR_MARK_SWEEP_H_
std::unique_ptr< YoungGenerationRememberedSetsMarkingWorklist > remembered_sets_marking_handler_
YoungGenerationRememberedSetsMarkingWorklist * remembered_sets_marking_handler()
NonAtomicMarkingState *const non_atomic_marking_state_
V8_EXPORT_PRIVATE void DrainMarkingWorklist()
std::unique_ptr< PretenuringHandler::PretenuringFeedbackMap > pretenuring_feedback_
std::unique_ptr< EphemeronRememberedSet::TableList > ephemeron_table_list_
EphemeronRememberedSet::TableList * ephemeron_table_list() const
void MarkRoots(YoungGenerationRootMarkingVisitor &root_visitor, bool was_marked_incrementally)
YoungGenerationMainMarkingVisitor * main_marking_visitor()
std::unique_ptr< MarkingWorklists > marking_worklists_
std::optional< bool > use_background_threads_in_cycle_
MarkingWorklists::Local * local_marking_worklists()
void MarkRootsFromTracedHandles(YoungGenerationRootMarkingVisitor &root_visitor)
std::unique_ptr< YoungGenerationMainMarkingVisitor > main_marking_visitor_
Heap::ResizeNewSpaceMode ResizeNewSpaceMode
void MarkRootsFromConservativeStack(YoungGenerationRootMarkingVisitor &root_visitor)
static constexpr size_t kMaxParallelTasks
void StartMarking(bool force_use_background_threads)
void EvacuateExternalPointerReferences(MutablePageMetadata *p)
Local(YoungGenerationRememberedSetsMarkingWorklist *handler)
YoungGenerationRememberedSetsMarkingWorklist *const handler_
MarkingItem(MutablePageMetadata *chunk, SlotsType slots_type, TypedSlotSet *typed_slot_set)
MarkingItem(MutablePageMetadata *chunk, SlotsType slots_type, SlotSet *slot_set, SlotSet *background_slot_set)
V8_INLINE SlotCallbackResult CheckAndMarkObject(Visitor *visitor, TSlot slot)
bool ProcessNextItem(Visitor *visitor, std::optional< size_t > &index)
static std::vector< MarkingItem > CollectItems(Heap *heap)
GarbageCollector collector() const override
YoungGenerationRootMarkingVisitor(const YoungGenerationRootMarkingVisitor &)=delete
V8_INLINE void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end) final
YoungGenerationRootMarkingVisitor(MinorMarkSweepCollector *collector)
YoungGenerationRootMarkingVisitor & operator=(const YoungGenerationRootMarkingVisitor &)=delete
V8_INLINE void VisitRootPointer(Root root, const char *description, FullObjectSlot p) final
YoungGenerationMainMarkingVisitor *const main_marking_visitor_
void VisitPointersImpl(Root root, TSlot start, TSlot end)
int start
int end
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define V8_EXPORT_PRIVATE
Definition macros.h:460
#define V8_INLINE
Definition v8config.h:500