5#ifndef V8_HEAP_SCAVENGER_H_
6#define V8_HEAP_SCAVENGER_H_
25class RootScavengeVisitor;
109 template <
typename TSlot>
112 template <
typename TSlot>
124 template <
typename THeapObjectSlot>
136 template <
typename THeapObjectSlot>
141 template <
typename THeapObjectSlot,
144 THeapObjectSlot slot,
149 template <
typename THeapObjectSlot>
158 template <
typename THeapObjectSlot,
164 template <
typename THeapObjectSlot>
166 THeapObjectSlot slot,
170 template <
typename THeapObjectSlot>
172 THeapObjectSlot slot,
176 template <
typename THeapObjectSlot>
256 std::vector<std::unique_ptr<Scavenger>>* scavengers,
257 std::vector<std::pair<ParallelWorkItem, MutablePageMetadata*>>
276 std::vector<std::pair<ParallelWorkItem, MutablePageMetadata*>>
320 return is_done_.load(std::memory_order_relaxed) ? 0 : 1;
333 size_t size,
bool should_zap);
335 size_t size,
bool should_zap);
371 const size_t estimate =
373 return estimate == 0 ? 1 : estimate;
std::unordered_map< Tagged< EphemeronHashTable >, IndicesSet, Object::Hasher > TableMap
std::unordered_map< Tagged< AllocationSite >, size_t, Object::Hasher > PretenuringFeedbackMap
RootScavengeVisitor(Scavenger &scavenger)
void VisitRootPointer(Root root, const char *description, FullObjectSlot p) final
void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end) final
~RootScavengeVisitor() final
void ScavengePointer(FullObjectSlot p)
size_t GetMaxConcurrency(size_t worker_count) const override
void ProcessItems(JobDelegate *delegate, Scavenger *scavenger)
void Run(JobDelegate *delegate) override
void ConcurrentScavengePages(Scavenger *scavenger)
JobTask(ScavengerCollector *collector, std::vector< std::unique_ptr< Scavenger > > *scavengers, std::vector< std::pair< ParallelWorkItem, MutablePageMetadata * > > old_to_new_chunks, const Scavenger::CopiedList &copied_list, const Scavenger::PinnedList &pinned_list, const Scavenger::PromotedList &promoted_list)
const Scavenger::PromotedList & promoted_list_
ScavengerCollector * collector_
IndexGenerator generator_
uint64_t trace_id() const
const Scavenger::PinnedList & pinned_list_
const Scavenger::CopiedList & copied_list_
void VisitPinnedObjects(Scavenger *scavenger)
std::vector< std::pair< ParallelWorkItem, MutablePageMetadata * > > old_to_new_chunks_
std::atomic< size_t > remaining_memory_chunks_
std::vector< std::unique_ptr< Scavenger > > * scavengers_
PinnedObjectPerPage pinned_object_per_page_
size_t SweepPage(FreeSpaceHandler free_space_handler, MemoryChunk *chunk, PageMetadata *page, ObjectsAndSizes &pinned_objects_on_page)
std::atomic_bool is_done_
PinnedObjects pinned_objects_
static void AddToFreeListFreeSpaceHandler(Heap *heap, Address address, size_t size, bool should_zap)
void Run(JobDelegate *delegate) override
std::unordered_map< MemoryChunk *, ObjectsAndSizes, base::hash< MemoryChunk * > > PinnedObjectPerPage
uint64_t trace_id() const
std::vector< std::pair< Address, size_t > > ObjectsAndSizes
JobTask(Heap *heap, const PinnedObjects &&pinned_objects)
size_t GetMaxConcurrency(size_t worker_count) const override
static void CreateFillerFreeSpaceHandler(Heap *heap, Address address, size_t size, bool should_zap)
PinnedObjectPerPage::iterator next_page_iterator_
std::function< void(Heap *, Address, size_t, bool)> FreeSpaceHandler
void CreateFillerFreeHandler(Address address, size_t size)
void StartSweeping(const PinnedObjects &&pinned_objects)
QuarantinedPageSweeper(Heap *heap)
~QuarantinedPageSweeper()
std::unique_ptr< JobHandle > job_handle_
ScavengerCollector(Heap *heap)
void ClearOldEphemerons()
void MergeSurvivingNewLargeObjects(const SurvivingNewLargeObjectsMap &objects)
QuarantinedPageSweeper quarantined_page_sweeper_
size_t FetchAndResetConcurrencyEstimate()
void SweepArrayBufferExtensions()
void ClearYoungEphemerons(EphemeronRememberedSet::TableList *ephemeron_table_list)
static const int kMaxScavengerTasks
int NumberOfScavengeTasks()
void CompleteSweepingQuarantinedPagesIfNeeded()
std::atomic< size_t > estimate_concurrency_
void ProcessWeakReferences(EphemeronRememberedSet::TableList *ephemeron_table_list)
void HandleSurvivingNewLargeObjects()
SurvivingNewLargeObjectsMap surviving_new_large_objects_
static const int kMainThreadId
std::vector< PinnedObjectEntry > PinnedObjects
static constexpr int kPromotedListSegmentSize
V8_INLINE SlotCallbackResult EvacuateObject(THeapObjectSlot slot, Tagged< Map > map, Tagged< HeapObject > source)
EvacuationAllocator allocator_
EphemeronRememberedSet::TableList::Local local_ephemeron_table_list_
void PushPinnedObject(Tagged< HeapObject > object, Tagged< Map > map, int object_size)
ScavengerCollector *const collector_
PretenuringHandler::PretenuringFeedbackMap local_pretenuring_feedback_
void RememberPromotedEphemeron(Tagged< EphemeronHashTable > table, int index)
V8_INLINE SlotCallbackResult RememberedSetEntryNeeded(CopyAndForwardResult result)
void AddEphemeronHashTable(Tagged< EphemeronHashTable > table)
const bool shared_string_table_
size_t bytes_copied() const
EmptyChunksList::Local local_empty_chunks_
V8_INLINE CopyAndForwardResult PromoteObject(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
std::pair< Tagged< HeapObject >, Tagged< Map > > ObjectAndMap
PromotedList::Local local_promoted_list_
void SynchronizePageAccess(Tagged< MaybeObject > object) const
SlotCallbackResult EvacuateThinString(Tagged< Map > map, THeapObjectSlot slot, Tagged< ThinString > object, int object_size)
void VisitPinnedObjects()
V8_INLINE bool ShouldEagerlyProcessPromotedList() const
static const int kInterruptThreshold
SlotCallbackResult EvacuateInPlaceInternalizableString(Tagged< Map > map, THeapObjectSlot slot, Tagged< String > string, int object_size, ObjectFields object_fields)
void AddPageToSweeperIfNecessary(MutablePageMetadata *page)
void IterateAndScavengePromotedObject(Tagged< HeapObject > target, Tagged< Map > map, int size)
SlotCallbackResult ScavengeObject(THeapObjectSlot p, Tagged< HeapObject > object)
const bool mark_shared_heap_
V8_INLINE SlotCallbackResult EvacuateObjectDefault(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
V8_INLINE CopyAndForwardResult SemiSpaceCopyObject(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
V8_INLINE bool MigrateObject(Tagged< Map > map, Tagged< HeapObject > source, Tagged< HeapObject > target, int size, PromotionHeapChoice promotion_heap_choice)
static constexpr int kPinnedListSegmentSize
V8_INLINE bool HandleLargeObject(Tagged< Map > map, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
bool PromoteIfLargeObject(Tagged< HeapObject > object)
SlotCallbackResult EvacuateShortcutCandidate(Tagged< Map > map, THeapObjectSlot slot, Tagged< ConsString > object, int object_size)
SlotCallbackResult CheckAndScavengeObject(Heap *heap, TSlot slot)
CopiedList::Local local_copied_list_
const bool shortcut_strings_
void Process(JobDelegate *delegate=nullptr)
PinnedList::Local local_pinned_list_
void CheckOldToNewSlotForSharedUntyped(MemoryChunk *chunk, MutablePageMetadata *page, TSlot slot)
size_t bytes_promoted() const
void ScavengePage(MutablePageMetadata *page)
void CheckOldToNewSlotForSharedTyped(MemoryChunk *chunk, MutablePageMetadata *page, SlotType slot_type, Address slot_address, Tagged< MaybeObject > new_target)
SurvivingNewLargeObjectsMap local_surviving_new_large_objects_
EphemeronRememberedSet::TableMap local_ephemeron_remembered_set_
static constexpr int kCopiedListSegmentSize
void PushPinnedPromotedObject(Tagged< HeapObject > object, Tagged< Map > map, int object_size)
void PinAndPushObject(MemoryChunk *chunk, Tagged< HeapObject > object, MapWord map_word)
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
std::pair< Tagged< HeapObject >, Tagged< Map > > SurvivingNewLargeObjectMapEntry
std::unordered_map< Tagged< HeapObject >, Tagged< Map >, Object::Hasher > SurvivingNewLargeObjectsMap
@ SUCCESS_YOUNG_GENERATION
use conservative stack scanning use direct handles with conservative stack scanning Treat some precise references as conservative references to stress test object pinning in Scavenger minor_gc_task Enables random stressing of object pinning in Scavenger
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
Tagged< HeapObject > heap_object