10fce9c80a
The memory metric samples memory usage immediately after forcing GC via LowMemoryNotification. This makes the metric sensitive to the unmapper tasks timing. This patch forces eager unmapping in CollectAllAvailableGarbage. It also forces eager unmapping of non-regular chunks at the beginning of Mark-Compact to avoid accumulation of non-regular chunks. Bug: chromium:833291, chromium:826384 Change-Id: Iddf02cd4ab8613385d033899d29525fe6ee47fdd Reviewed-on: https://chromium-review.googlesource.com/1017102 Commit-Queue: Ulan Degenbaev <ulan@chromium.org> Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Cr-Commit-Position: refs/heads/master@{#52696}
71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
// Copyright 2018 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/v8.h"
|
|
|
|
#include "src/heap/spaces.h"
|
|
#include "test/cctest/cctest.h"
|
|
#include "test/cctest/heap/heap-utils.h"
|
|
|
|
using v8::IdleTask;
|
|
using v8::Task;
|
|
using v8::Isolate;
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace heap {
|
|
|
|
class MockPlatformForUnmapper : public TestPlatform {
|
|
public:
|
|
MockPlatformForUnmapper()
|
|
: task_(nullptr), old_platform_(i::V8::GetCurrentPlatform()) {
|
|
// Now that it's completely constructed, make this the current platform.
|
|
i::V8::SetPlatformForTesting(this);
|
|
}
|
|
virtual ~MockPlatformForUnmapper() {
|
|
delete task_;
|
|
i::V8::SetPlatformForTesting(old_platform_);
|
|
for (auto& task : worker_tasks_) {
|
|
old_platform_->CallOnWorkerThread(std::move(task));
|
|
}
|
|
worker_tasks_.clear();
|
|
}
|
|
|
|
void CallOnForegroundThread(v8::Isolate* isolate, Task* task) override {
|
|
task_ = task;
|
|
}
|
|
|
|
void CallOnWorkerThread(std::unique_ptr<Task> task) override {
|
|
worker_tasks_.push_back(std::move(task));
|
|
}
|
|
|
|
bool IdleTasksEnabled(v8::Isolate* isolate) override { return false; }
|
|
|
|
int NumberOfWorkerThreads() override {
|
|
return old_platform_->NumberOfWorkerThreads();
|
|
}
|
|
|
|
size_t NumberOfAvailableBackgroundThreads() override {
|
|
return old_platform_->NumberOfAvailableBackgroundThreads();
|
|
}
|
|
|
|
private:
|
|
Task* task_;
|
|
std::vector<std::unique_ptr<Task>> worker_tasks_;
|
|
v8::Platform* old_platform_;
|
|
};
|
|
|
|
TEST(EagerUnmappingInCollectAllAvailableGarbage) {
|
|
CcTest::InitializeVM();
|
|
MockPlatformForUnmapper platform;
|
|
Heap* heap = CcTest::heap();
|
|
i::heap::SimulateFullSpace(heap->old_space());
|
|
CcTest::CollectAllAvailableGarbage();
|
|
CHECK_EQ(0, heap->memory_allocator()->unmapper()->NumberOfChunks());
|
|
}
|
|
|
|
} // namespace heap
|
|
} // namespace internal
|
|
} // namespace v8
|