| // Copyright 2014 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 <cmath> |
| #include <iostream> |
| #include <limits> |
| |
| #include "src/objects/objects-inl.h" |
| #include "src/objects/objects.h" |
| |
| #include "src/handles/handles-inl.h" |
| #include "src/handles/handles.h" |
| |
| #include "src/heap/heap-controller.h" |
| #include "test/unittests/test-utils.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| using MemoryControllerTest = TestWithIsolate; |
| |
| double Round(double x) { |
| // Round to three digits. |
| return floor(x * 1000 + 0.5) / 1000; |
| } |
| |
| void CheckEqualRounded(double expected, double actual) { |
| expected = Round(expected); |
| actual = Round(actual); |
| EXPECT_DOUBLE_EQ(expected, actual); |
| } |
| |
| namespace { |
| |
| using V8Controller = MemoryController<V8HeapTrait>; |
| |
| } // namespace |
| |
| TEST_F(MemoryControllerTest, HeapGrowingFactor) { |
| CheckEqualRounded(V8HeapTrait::kMaxGrowingFactor, |
| V8Controller::DynamicGrowingFactor(34, 1, 4.0)); |
| CheckEqualRounded(3.553, V8Controller::DynamicGrowingFactor(45, 1, 4.0)); |
| CheckEqualRounded(2.830, V8Controller::DynamicGrowingFactor(50, 1, 4.0)); |
| CheckEqualRounded(1.478, V8Controller::DynamicGrowingFactor(100, 1, 4.0)); |
| CheckEqualRounded(1.193, V8Controller::DynamicGrowingFactor(200, 1, 4.0)); |
| CheckEqualRounded(1.121, V8Controller::DynamicGrowingFactor(300, 1, 4.0)); |
| CheckEqualRounded(V8Controller::DynamicGrowingFactor(300, 1, 4.0), |
| V8Controller::DynamicGrowingFactor(600, 2, 4.0)); |
| CheckEqualRounded(V8HeapTrait::kMinGrowingFactor, |
| V8Controller::DynamicGrowingFactor(400, 1, 4.0)); |
| } |
| |
| TEST_F(MemoryControllerTest, MaxHeapGrowingFactor) { |
| CheckEqualRounded(1.3, V8Controller::MaxGrowingFactor(V8HeapTrait::kMinSize)); |
| CheckEqualRounded(1.600, |
| V8Controller::MaxGrowingFactor(V8HeapTrait::kMaxSize / 2)); |
| CheckEqualRounded(2.0, |
| V8Controller::MaxGrowingFactor( |
| (V8HeapTrait::kMaxSize - Heap::kPointerMultiplier))); |
| CheckEqualRounded(4.0, V8Controller::MaxGrowingFactor( |
| static_cast<size_t>(V8HeapTrait::kMaxSize))); |
| } |
| |
| TEST_F(MemoryControllerTest, OldGenerationAllocationLimit) { |
| Heap* heap = i_isolate()->heap(); |
| size_t old_gen_size = 128 * MB; |
| size_t max_old_generation_size = 512 * MB; |
| double gc_speed = 100; |
| double mutator_speed = 1; |
| size_t new_space_capacity = 16 * MB; |
| |
| double factor = V8Controller::GrowingFactor(heap, max_old_generation_size, |
| gc_speed, mutator_speed); |
| |
| EXPECT_EQ(static_cast<size_t>(old_gen_size * factor + new_space_capacity), |
| V8Controller::CalculateAllocationLimit( |
| heap, old_gen_size, 0u, max_old_generation_size, |
| new_space_capacity, factor, Heap::HeapGrowingMode::kDefault)); |
| |
| factor = Min(factor, V8HeapTrait::kConservativeGrowingFactor); |
| EXPECT_EQ(static_cast<size_t>(old_gen_size * factor + new_space_capacity), |
| V8Controller::CalculateAllocationLimit( |
| heap, old_gen_size, 0u, max_old_generation_size, |
| new_space_capacity, factor, Heap::HeapGrowingMode::kSlow)); |
| |
| factor = Min(factor, V8HeapTrait::kConservativeGrowingFactor); |
| EXPECT_EQ( |
| static_cast<size_t>(old_gen_size * factor + new_space_capacity), |
| V8Controller::CalculateAllocationLimit( |
| heap, old_gen_size, 0u, max_old_generation_size, new_space_capacity, |
| factor, Heap::HeapGrowingMode::kConservative)); |
| |
| factor = V8HeapTrait::kMinGrowingFactor; |
| EXPECT_EQ(static_cast<size_t>(old_gen_size * factor + new_space_capacity), |
| V8Controller::CalculateAllocationLimit( |
| heap, old_gen_size, 0u, max_old_generation_size, |
| new_space_capacity, factor, Heap::HeapGrowingMode::kMinimal)); |
| |
| factor = V8HeapTrait::kMinGrowingFactor; |
| size_t min_old_generation_size = |
| 2 * static_cast<size_t>(old_gen_size * factor + new_space_capacity); |
| EXPECT_EQ( |
| min_old_generation_size, |
| V8Controller::CalculateAllocationLimit( |
| heap, old_gen_size, min_old_generation_size, max_old_generation_size, |
| new_space_capacity, factor, Heap::HeapGrowingMode::kMinimal)); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |