34class ObjectSizeCounter :
private HeapVisitor<ObjectSizeCounter> {
35 friend class HeapVisitor<ObjectSizeCounter>;
38 size_t GetSize(RawHeap&
heap) {
44 static size_t ObjectSize(
const HeapObjectHeader& header) {
45 return ObjectView<>(header).Size();
48 bool VisitHeapObjectHeader(HeapObjectHeader& header) {
49 if (header.IsFree())
return true;
57#if defined(CPPGC_YOUNG_GENERATION)
58class AgeTableResetter final :
protected HeapVisitor<AgeTableResetter> {
59 friend class HeapVisitor<AgeTableResetter>;
62 AgeTableResetter() : age_table_(CagedHeapLocalData::Get().age_table) {}
64 void Run(RawHeap& raw_heap) { Traverse(raw_heap); }
67 bool VisitPage(BasePage& page) {
68 if (!page.contains_young_objects()) {
71 age_table_.GetAgeForRange(
72 CagedHeap::OffsetFromAddress(page.PayloadStart()),
73 CagedHeap::OffsetFromAddress(page.PayloadEnd())));
80 age_table_.SetAgeForRange(CagedHeap::OffsetFromAddress(page.PayloadStart()),
81 CagedHeap::OffsetFromAddress(page.PayloadEnd()),
83 AgeTable::AdjacentCardsPolicy::kIgnore);
85 page.set_as_containing_young_objects(
false);
89 bool VisitNormalPage(NormalPage& page) {
return VisitPage(page); }
90 bool VisitLargePage(LargePage& page) {
return VisitPage(page); }
100 std::shared_ptr<cppgc::Platform> platform,
101 const std::vector<std::unique_ptr<CustomSpaceBase>>& custom_spaces,
104 : raw_heap_(this, custom_spaces),
108 lsan_page_allocator_(
std::make_unique<
v8::
base::LsanPageAllocator>(
111 page_backend_(InitializePageBackend(*page_allocator())),
115 compactor_(raw_heap_),
117 *prefinalizer_handler_, *oom_handler_,
120 strong_persistent_region_(*this, *oom_handler_),
121 weak_persistent_region_(*this, *oom_handler_),
122 strong_cross_thread_persistent_region_(*oom_handler_),
123 weak_cross_thread_persistent_region_(*oom_handler_),
124#if
defined(CPPGC_YOUNG_GENERATION)
125 remembered_set_(*this),
127 stack_support_(stack_support),
128 marking_support_(marking_support),
129 sweeping_support_(sweeping_support) {
138#if defined(LEAK_SANITIZER)
139 return lsan_page_allocator_.get();
152#if defined(CPPGC_CAGED_HEAP)
154 return std::make_unique<PageBackend>(caged_heap.page_allocator(),
155 caged_heap.page_allocator());
157 return std::make_unique<PageBackend>(allocator, allocator);
162#ifdef CPPGC_ALLOW_ALLOCATIONS_IN_PREFINALIZERS
173#if defined(CPPGC_YOUNG_GENERATION)
174void HeapBase::EnableGenerationalGC() {
177#if defined(CPPGC_CAGED_HEAP)
182 YoungGenerationEnabler::Enable();
189void HeapBase::ResetRememberedSet() {
191 class AllLABsAreEmpty final :
protected HeapVisitor<AllLABsAreEmpty> {
192 friend class HeapVisitor<AllLABsAreEmpty>;
195 explicit AllLABsAreEmpty(RawHeap& raw_heap) { Traverse(raw_heap); }
197 bool value()
const {
return !some_lab_is_set_; }
200 bool VisitNormalPageSpace(NormalPageSpace& space) {
202 static_cast<bool>(space.linear_allocation_buffer().
size());
207 bool some_lab_is_set_ =
false;
212 DCHECK(remembered_set_.IsEmpty());
216 AgeTableResetter age_table_resetter;
219 remembered_set_.Reset();
233#if defined(CPPGC_YOUNG_GENERATION)
237 YoungGenerationEnabler::Disable();
241 constexpr size_t kMaxTerminationGCs = 20;
243 bool more_termination_gcs_needed =
false;
254#if defined(CPPGC_YOUNG_GENERATION)
265 GCConfig::MarkingType::kAtomic,
266 GCConfig::IsForcedGC::kForced);
276 more_termination_gcs_needed =
284 }
while (more_termination_gcs_needed && (gc_count < kMaxTerminationGCs));
293 CHECK_LE(gc_count, kMaxTerminationGCs);
302 const size_t pooled_memory =
page_backend_->page_pool().PooledMemory();
303 const size_t committed_memory =
305 const size_t resident_memory =
308 return {committed_memory,
323 size_t size_including_header) {
325 listener->OnMove(from, to, size_including_header);
357 saved_heap_object_name_value_(
heap_.name_of_unnamed_object()) {
bool is_young_generation_enabled_
V8_INLINE bool is_young_generation_enabled() const
friend class internal::HeapBase
static void CommitAgeTable(PageAllocator &platform_allocator)
static CagedHeap & Instance()
const HeapObjectNameForUnnamedObject saved_heap_object_name_value_
~ClassNameAsHeapObjectNameScope()
ClassNameAsHeapObjectNameScope(HeapBase &heap)
size_t NodesInUse() const
void RegisterMoveListener(MoveListener *listener)
void CallMoveListeners(Address from, Address to, size_t size_including_header)
std::vector< MoveListener * > move_listeners_
std::unique_ptr< StatsCollector > stats_collector_
std::unique_ptr< heap::base::Stack > stack_
PageAllocator * page_allocator() const
PersistentRegion weak_persistent_region_
size_t ExecutePreFinalizers()
ObjectAllocator object_allocator_
HeapStatistics CollectStatistics(HeapStatistics::DetailLevel)
size_t ObjectPayloadSize() const
std::shared_ptr< cppgc::Platform > platform_
std::unique_ptr< PreFinalizerHandler > prefinalizer_handler_
virtual bool CurrentThreadIsHeapThread() const
bool generational_gc_supported() const
bool in_atomic_pause() const
std::unique_ptr< PageBackend > page_backend_
static std::unique_ptr< PageBackend > InitializePageBackend(PageAllocator &allocator)
StatsCollector * stats_collector()
CrossThreadPersistentRegion weak_cross_thread_persistent_region_
CrossThreadPersistentRegion strong_cross_thread_persistent_region_
virtual bool IsGCForbidden() const
void set_name_of_unnamed_object(HeapObjectNameForUnnamedObject value)
void UnregisterMoveListener(MoveListener *listener)
virtual bool IsGCAllowed() const
PersistentRegion strong_persistent_region_
ProcessHeapStatisticsUpdater::AllocationObserverImpl allocation_observer_for_PROCESS_HEAP_STATISTICS_
ObjectAllocator & object_allocator()
size_t disallow_gc_scope_
bool in_no_gc_scope() const
HeapStatistics CollectDetailedStatistics(HeapBase *)
void MarkAllPagesAsYoung()
void ResetLinearAllocationBuffers()
size_t NodesInUse() const
void RegisterObserver(AllocationObserver *)
void NotifyMarkingCompleted(size_t marked_bytes)
void NotifyMarkingStarted(CollectionType, MarkingType, IsForcedGC)
bool IsSweepingOnMutatorThread() const
void Start(SweepingConfig)
static int GetCurrentThreadId()
StatsCollector * stats_collector_
@ kUseClassNameIfSupported
#define CHECK_LE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
std::unique_ptr< ValueMirror > value