// 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 #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_