24constexpr double kMaximumLimitRatioForIncrementalGC = 0.9;
27constexpr double kMinimumLimitRatioForIncrementalGC = 0.5;
77 marking_support_(marking_support),
78 sweeping_support_(sweeping_support) {
80 initial_heap_size_ = constraints.initial_heap_size_bytes;
82 constexpr size_t kNoAllocatedBytes = 0;
92 if (disabled_for_testing_)
return;
94 if (allocated_object_size > limit_for_atomic_gc_) {
97 GCConfig::MarkingType::kAtomic, sweeping_support_});
98 }
else if (allocated_object_size > limit_for_incremental_gc_) {
100 collector_->StartIncrementalGarbageCollection(
102 marking_support_, sweeping_support_});
107 size_t allocated_object_size) {
108 ConfigureLimit(allocated_object_size);
112 size_t allocated_object_size) {
113 const size_t size = std::max(allocated_object_size, initial_heap_size_);
114 limit_for_atomic_gc_ = std::max(
static_cast<size_t>(size *
kGrowingFactor),
126 size_t estimated_bytes_allocated_during_incremental_gc =
130 size_t limit_incremental_gc_based_on_allocation_rate =
131 limit_for_atomic_gc_ - estimated_bytes_allocated_during_incremental_gc;
132 size_t maximum_limit_incremental_gc =
133 size + (limit_for_atomic_gc_ -
size) * kMaximumLimitRatioForIncrementalGC;
134 size_t minimum_limit_incremental_gc =
135 size + (limit_for_atomic_gc_ -
size) * kMinimumLimitRatioForIncrementalGC;
136 limit_for_incremental_gc_ =
137 std::max(minimum_limit_incremental_gc,
138 std::min(maximum_limit_incremental_gc,
139 limit_incremental_gc_based_on_allocation_rate));
143 disabled_for_testing_ =
true;
152 collector, stats_collector, constraints, marking_support,
153 sweeping_support)) {}
158 return impl_->limit_for_atomic_gc();
161 return impl_->limit_for_incremental_gc();
GarbageCollector * collector_
StatsCollector * stats_collector_
HeapGrowingImpl(const HeapGrowingImpl &)=delete
size_t limit_for_atomic_gc_
void ResetAllocatedObjectSize(size_t) final
size_t initial_heap_size_
HeapGrowingImpl(GarbageCollector *, StatsCollector *, cppgc::Heap::ResourceConstraints, cppgc::Heap::MarkingType, cppgc::Heap::SweepingType)
void ConfigureLimit(size_t allocated_object_size)
size_t limit_for_incremental_gc_
SingleThreadedHandle gc_task_handle_
void AllocatedObjectSizeIncreased(size_t) final
bool disabled_for_testing_
HeapGrowingImpl & operator=(const HeapGrowingImpl &)=delete
const cppgc::Heap::MarkingType marking_support_
const cppgc::Heap::SweepingType sweeping_support_
void AllocatedObjectSizeDecreased(size_t) final
size_t limit_for_incremental_gc() const
size_t limit_for_atomic_gc() const
size_t limit_for_atomic_gc() const
static constexpr size_t kMinLimitIncrease
std::unique_ptr< HeapGrowingImpl > impl_
static constexpr double kGrowingFactor
HeapGrowing(GarbageCollector *, StatsCollector *, cppgc::Heap::ResourceConstraints, cppgc::Heap::MarkingType, cppgc::Heap::SweepingType)
size_t limit_for_incremental_gc() const
void RegisterObserver(AllocationObserver *)
static constexpr v8::base::TimeDelta kEstimatedMarkingTime
StatsCollector * stats_collector_
MarkCompactCollector * collector_
size_t initial_heap_size_bytes