Skip to content

Commit c172ffc

Browse files
tunzV8 LUCI CQ
authored andcommitted
Compact retained maps array more often
When we add maps to the retained maps array, we compacted the array if it's full. But, since we are now adding maps in a batch, it's unlikely to meet the condition. Thus, update the condition to check whether new size exceeds the capacity. Bug: 398528460 Change-Id: I89caa47b69532c6397596edfe5caf7c7d24768cc Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6330019 Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Commit-Queue: Choongwoo Han <choongwoo.han@microsoft.com> Cr-Commit-Position: refs/heads/main@{#99163}
1 parent 03bd506 commit c172ffc

2 files changed

Lines changed: 9 additions & 6 deletions

File tree

src/heap/heap.cc

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6337,12 +6337,13 @@ void Heap::AddRetainedMaps(DirectHandle<NativeContext> context,
63376337
GlobalHandleVector<Map> maps) {
63386338
Handle<WeakArrayList> array(Cast<WeakArrayList>(context->retained_maps()),
63396339
isolate());
6340-
if (array->IsFull()) {
6340+
int new_maps_size = static_cast<int>(maps.size()) * kRetainMapEntrySize;
6341+
if (array->length() + new_maps_size > array->capacity()) {
63416342
CompactRetainedMaps(*array);
63426343
}
63436344
int cur_length = array->length();
6344-
array = WeakArrayList::EnsureSpace(
6345-
isolate(), array, cur_length + static_cast<int>(maps.size()) * 2);
6345+
array =
6346+
WeakArrayList::EnsureSpace(isolate(), array, cur_length + new_maps_size);
63466347
if (*array != context->retained_maps()) {
63476348
context->set_retained_maps(*array);
63486349
}
@@ -6360,7 +6361,7 @@ void Heap::AddRetainedMaps(DirectHandle<NativeContext> context,
63606361
raw_array->Set(cur_length, MakeWeak(*map));
63616362
raw_array->Set(cur_length + 1,
63626363
Smi::FromInt(v8_flags.retain_maps_for_n_gc));
6363-
cur_length += 2;
6364+
cur_length += kRetainMapEntrySize;
63646365
raw_array->set_length(cur_length);
63656366

63666367
map->set_is_in_retained_map_list(true);
@@ -6372,7 +6373,7 @@ void Heap::CompactRetainedMaps(Tagged<WeakArrayList> retained_maps) {
63726373
int length = retained_maps->length();
63736374
int new_length = 0;
63746375
// This loop compacts the array by removing cleared weak cells.
6375-
for (int i = 0; i < length; i += 2) {
6376+
for (int i = 0; i < length; i += kRetainMapEntrySize) {
63766377
Tagged<MaybeObject> maybe_object = retained_maps->Get(i);
63776378
if (maybe_object.IsCleared()) {
63786379
continue;
@@ -6386,7 +6387,7 @@ void Heap::CompactRetainedMaps(Tagged<WeakArrayList> retained_maps) {
63866387
retained_maps->Set(new_length, maybe_object);
63876388
retained_maps->Set(new_length + 1, age);
63886389
}
6389-
new_length += 2;
6390+
new_length += kRetainMapEntrySize;
63906391
}
63916392
Tagged<HeapObject> undefined = ReadOnlyRoots(this).undefined_value();
63926393
for (int i = new_length; i < length; i++) {

src/heap/heap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,6 +1817,8 @@ class Heap final {
18171817
void AddToRingBuffer(const char* string);
18181818
void GetFromRingBuffer(char* buffer);
18191819

1820+
static constexpr int kRetainMapEntrySize = 2;
1821+
18201822
void CompactRetainedMaps(Tagged<WeakArrayList> retained_maps);
18211823

18221824
void CollectGarbageOnMemoryPressure();

0 commit comments

Comments
 (0)