25981026dc
Instead of using the high water mark for determining this metric, we use a bitset for all active/used system pages on a V8 heap page. Each time when allocating a LAB on a page, we add the pages of that memory range to that bitset. During sweeping we rebuild that bitset from scratch and replace it with the old one in case free pages are discarded by the GC. We DCHECK here that the sweeper only ever removes pages. This has the nice benefit of ensuring that we don't miss any allocations (like we do now for concurrent allocations). CommittedPhysicalMemory for a page is then calculated by counting the set bits in the bitset and multiplying it with the system page size. This should be simpler to verify and track the "real" effective size more precisely. One case where we are partially less precise than the current implementation is for LABs. In order to reduce complexity we now treat all pages of a LAB allocation as active immediately. In the current implementation we tried to only account the actual used part of the LAB when changing the LAB later. This is more complex to track correctly but also doesn't account the currently used LAB in effective size. Change-Id: Ia83df9ad5fbb852f0717c4c396b5074604bd21e9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3497363 Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Commit-Queue: Dominik Inführ <dinfuehr@chromium.org> Cr-Commit-Position: refs/heads/main@{#79428}
82 lines
2.6 KiB
C++
82 lines
2.6 KiB
C++
// Copyright 2022 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "src/heap/base/active-system-pages.h"
|
|
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace heap {
|
|
namespace base {
|
|
|
|
TEST(ActiveSystemPagesTest, Add) {
|
|
ActiveSystemPages pages;
|
|
const size_t kPageSizeBits = 0;
|
|
EXPECT_EQ(pages.Add(0, 1, kPageSizeBits), size_t{1});
|
|
EXPECT_EQ(pages.Add(1, 2, kPageSizeBits), size_t{1});
|
|
EXPECT_EQ(pages.Add(63, 64, kPageSizeBits), size_t{1});
|
|
EXPECT_EQ(pages.Size(kPageSizeBits), size_t{3});
|
|
|
|
// Try to add page a second time.
|
|
EXPECT_EQ(pages.Add(0, 2, kPageSizeBits), size_t{0});
|
|
}
|
|
|
|
TEST(ActiveSystemPagesTest, AddUnalignedRange) {
|
|
ActiveSystemPages pages;
|
|
const size_t kPageSizeBits = 12;
|
|
const size_t kPageSize = size_t{1} << kPageSizeBits;
|
|
const size_t kWordSize = 8;
|
|
EXPECT_EQ(pages.Add(0, kPageSize + kWordSize, kPageSizeBits), size_t{2});
|
|
EXPECT_EQ(pages.Add(3 * kPageSize - kWordSize, 3 * kPageSize, kPageSizeBits),
|
|
size_t{1});
|
|
EXPECT_EQ(pages.Add(kPageSize + kWordSize, 3 * kPageSize - kWordSize,
|
|
kPageSizeBits),
|
|
size_t{0});
|
|
EXPECT_EQ(pages.Size(kPageSizeBits), size_t{3} * kPageSize);
|
|
}
|
|
|
|
TEST(ActiveSystemPagesTest, AddFullBitset) {
|
|
ActiveSystemPages pages;
|
|
const size_t kPageSizeBits = 0;
|
|
EXPECT_EQ(pages.Add(0, 64, kPageSizeBits), size_t{64});
|
|
EXPECT_EQ(pages.Add(0, 64, kPageSizeBits), size_t{0});
|
|
EXPECT_EQ(pages.Size(kPageSizeBits), size_t{64});
|
|
}
|
|
|
|
TEST(ActiveSystemPagesTest, Reduce) {
|
|
ActiveSystemPages original;
|
|
const size_t kPageSizeBits = 0;
|
|
EXPECT_EQ(original.Add(0, 3, kPageSizeBits), size_t{3});
|
|
|
|
ActiveSystemPages updated;
|
|
EXPECT_EQ(updated.Add(1, 3, kPageSizeBits), size_t{2});
|
|
|
|
EXPECT_EQ(original.Reduce(updated), size_t{1});
|
|
}
|
|
|
|
TEST(ActiveSystemPagesTest, ReduceFullBitset) {
|
|
ActiveSystemPages original;
|
|
const size_t kPageSizeBits = 0;
|
|
EXPECT_EQ(original.Add(0, 64, kPageSizeBits), size_t{64});
|
|
|
|
ActiveSystemPages updated;
|
|
EXPECT_EQ(updated.Add(63, 64, kPageSizeBits), size_t{1});
|
|
|
|
EXPECT_EQ(original.Reduce(updated), size_t{63});
|
|
}
|
|
|
|
TEST(ActiveSystemPagesTest, Clear) {
|
|
ActiveSystemPages pages;
|
|
const size_t kPageSizeBits = 0;
|
|
EXPECT_EQ(pages.Add(0, 64, kPageSizeBits), size_t{64});
|
|
EXPECT_EQ(pages.Clear(), size_t{64});
|
|
EXPECT_EQ(pages.Size(kPageSizeBits), size_t{0});
|
|
|
|
EXPECT_EQ(pages.Add(0, 2, kPageSizeBits), size_t{2});
|
|
EXPECT_EQ(pages.Clear(), size_t{2});
|
|
EXPECT_EQ(pages.Size(kPageSizeBits), size_t{0});
|
|
}
|
|
|
|
} // namespace base
|
|
} // namespace heap
|