| // Copyright 2012 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. |
| |
| #ifndef V8_HEAP_HEAP_CONTROLLER_H_ |
| #define V8_HEAP_HEAP_CONTROLLER_H_ |
| |
| #include <cstddef> |
| #include "src/allocation.h" |
| #include "src/heap/heap.h" |
| #include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck |
| |
| namespace v8 { |
| namespace internal { |
| |
| class V8_EXPORT_PRIVATE MemoryController { |
| public: |
| MemoryController(Heap* heap, double min_growing_factor, |
| double max_growing_factor, |
| double conservative_growing_factor, |
| double target_mutator_utilization, size_t min_size, |
| size_t max_size) |
| : heap_(heap), |
| kMinGrowingFactor(min_growing_factor), |
| kMaxGrowingFactor(max_growing_factor), |
| kConservativeGrowingFactor(conservative_growing_factor), |
| kTargetMutatorUtilization(target_mutator_utilization), |
| kMinSize(min_size), |
| kMaxSize(max_size) {} |
| virtual ~MemoryController() {} |
| |
| // Computes the allocation limit to trigger the next garbage collection. |
| size_t CalculateAllocationLimit(size_t curr_size, size_t max_size, |
| double gc_speed, double mutator_speed, |
| size_t new_space_capacity, |
| Heap::HeapGrowingMode growing_mode); |
| |
| // Computes the growing step when the limit increases. |
| size_t MinimumAllocationLimitGrowingStep(Heap::HeapGrowingMode growing_mode); |
| |
| protected: |
| double GrowingFactor(double gc_speed, double mutator_speed, |
| double max_factor); |
| double MaxGrowingFactor(size_t curr_max_size); |
| virtual const char* ControllerName() = 0; |
| |
| Heap* const heap_; |
| |
| const double kMinGrowingFactor; |
| const double kMaxGrowingFactor; |
| const double kConservativeGrowingFactor; |
| const double kTargetMutatorUtilization; |
| // Sizes are in MB. |
| const size_t kMinSize; |
| const size_t kMaxSize; |
| |
| FRIEND_TEST(HeapControllerTest, HeapGrowingFactor); |
| FRIEND_TEST(HeapControllerTest, MaxHeapGrowingFactor); |
| FRIEND_TEST(HeapControllerTest, MaxOldGenerationSize); |
| FRIEND_TEST(HeapControllerTest, OldGenerationAllocationLimit); |
| }; |
| |
| class HeapController : public MemoryController { |
| public: |
| explicit HeapController(Heap* heap) |
| : MemoryController(heap, 1.1, 4.0, 1.3, 0.97, kMinHeapSize, |
| kMaxHeapSize) {} |
| |
| // Sizes are in MB. |
| static const size_t kMinHeapSize = 128 * Heap::kPointerMultiplier; |
| static const size_t kMaxHeapSize = 1024 * Heap::kPointerMultiplier; |
| |
| protected: |
| const char* ControllerName() { return "HeapController"; } |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_HEAP_HEAP_CONTROLLER_H_ |