Skip to content

Commit 33a3d37

Browse files
etiennep-chromiumV8 LUCI CQ
authored andcommitted
[GC] Increase heap max_global_memory_size
Under external_memory_accounted_in_global_limit, external memory counts towards GlobalConsumedBytes(), which makes it more likely to reach max_global_memory_size. When this happens, allocation limits don't make a lot of sense, so this pushes back max_global_memory_size by a factor of 4, capped by `physical_memory`. Meanwhile, I'm also making another check more strict which will lead to an OOM if we still reach max_global_memory_size https://chromium-review.googlesource.com/c/v8/v8/+/6931616 Bug: 361124432 Change-Id: I3f3f940249da0579b86c2c2286e090bf09c0021a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6931611 Reviewed-by: Michael Lippautz <[email protected]> Commit-Queue: Etienne Pierre-Doray <[email protected]> Cr-Commit-Position: refs/heads/main@{#102367}
1 parent 75e7e87 commit 33a3d37

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

src/heap/heap.cc

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,11 +1479,15 @@ size_t GlobalMemorySizeFromV8Size(size_t v8_size) {
14791479

14801480
} // anonymous namespace
14811481

1482-
void Heap::SetOldGenerationAndGlobalMaximumSize(
1483-
size_t max_old_generation_size) {
1482+
void Heap::SetOldGenerationAndGlobalMaximumSize(size_t max_old_generation_size,
1483+
size_t physical_memory) {
14841484
max_old_generation_size_.store(max_old_generation_size,
14851485
std::memory_order_relaxed);
1486-
max_global_memory_size_ = GlobalMemorySizeFromV8Size(max_old_generation_size);
1486+
max_global_memory_size_ =
1487+
v8_flags.external_memory_accounted_in_global_limit
1488+
? std::min(physical_memory,
1489+
4 * GlobalMemorySizeFromV8Size(max_old_generation_size))
1490+
: GlobalMemorySizeFromV8Size(max_old_generation_size);
14871491
}
14881492

14891493
void Heap::SetOldGenerationAndGlobalAllocationLimit(
@@ -1673,7 +1677,8 @@ void Heap::CollectGarbage(AllocationSpace space,
16731677
if (initial_max_old_generation_size_ < max_old_generation_size() &&
16741678
OldGenerationSizeOfObjects() <
16751679
initial_max_old_generation_size_threshold_) {
1676-
SetOldGenerationAndGlobalMaximumSize(initial_max_old_generation_size_);
1680+
SetOldGenerationAndGlobalMaximumSize(initial_max_old_generation_size_,
1681+
physical_memory());
16771682
}
16781683
}
16791684

@@ -2584,8 +2589,6 @@ void Heap::RecomputeLimits(GarbageCollector collector, base::TimeTicks time) {
25842589
new_old_generation_allocation_limit, new_global_allocation_limit);
25852590
}
25862591

2587-
CHECK_EQ(max_global_memory_size_,
2588-
GlobalMemorySizeFromV8Size(max_old_generation_size_));
25892592
CHECK_GE(global_allocation_limit(), old_generation_allocation_limit_);
25902593
}
25912594

@@ -2632,8 +2635,6 @@ void Heap::RecomputeLimitsAfterLoadingIfNeeded() {
26322635
SetOldGenerationAndGlobalAllocationLimit(new_old_generation_allocation_limit,
26332636
new_global_allocation_limit);
26342637

2635-
CHECK_EQ(max_global_memory_size_,
2636-
GlobalMemorySizeFromV8Size(max_old_generation_size_));
26372638
CHECK_GE(global_allocation_limit(), old_generation_allocation_limit_);
26382639
}
26392640

@@ -4354,8 +4355,10 @@ bool Heap::InvokeNearHeapLimitCallback() {
43544355
size_t heap_limit = callback(data, max_old_generation_size(),
43554356
initial_max_old_generation_size_);
43564357
if (heap_limit > max_old_generation_size()) {
4357-
SetOldGenerationAndGlobalMaximumSize(std::min(
4358-
heap_limit, AllocatorLimitOnMaxOldGenerationSize(physical_memory())));
4358+
SetOldGenerationAndGlobalMaximumSize(
4359+
std::min(heap_limit,
4360+
AllocatorLimitOnMaxOldGenerationSize(physical_memory())),
4361+
physical_memory());
43594362
return true;
43604363
}
43614364
}
@@ -5171,7 +5174,8 @@ void Heap::ConfigureHeap(const v8::ResourceConstraints& constraints,
51715174
max_old_generation_size =
51725175
RoundDown<PageMetadata::kPageSize>(max_old_generation_size);
51735176

5174-
SetOldGenerationAndGlobalMaximumSize(max_old_generation_size);
5177+
SetOldGenerationAndGlobalMaximumSize(
5178+
max_old_generation_size, constraints.physical_memory_size_in_bytes());
51755179
}
51765180

51775181
CHECK_IMPLIES(

src/heap/heap.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,8 @@ class Heap final {
711711
// Do not set the limit lower than the live size + some slack.
712712
size_t min_limit = SizeOfObjects() + SizeOfObjects() / 4;
713713
SetOldGenerationAndGlobalMaximumSize(
714-
std::min(max_old_generation_size(), std::max(heap_limit, min_limit)));
714+
std::min(max_old_generation_size(), std::max(heap_limit, min_limit)),
715+
physical_memory());
715716
}
716717

717718
// ===========================================================================
@@ -2019,7 +2020,8 @@ class Heap final {
20192020

20202021
// Sets max_old_generation_size_ and computes the new global heap limit from
20212022
// it.
2022-
void SetOldGenerationAndGlobalMaximumSize(size_t max_old_generation_size);
2023+
void SetOldGenerationAndGlobalMaximumSize(size_t max_old_generation_size,
2024+
size_t physical_memory);
20232025

20242026
// Sets allocation limits for both old generation and the global heap.
20252027
void SetOldGenerationAndGlobalAllocationLimit(

0 commit comments

Comments
 (0)