| // 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. |
| |
| #ifndef V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
| #define V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |
| |
| #include "src/common/globals.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| enum class GCIdleTimeAction : uint8_t { |
| kDone, |
| kIncrementalStep, |
| kFullGC, |
| }; |
| |
| class GCIdleTimeHeapState { |
| public: |
| void Print(); |
| |
| int contexts_disposed; |
| double contexts_disposal_rate; |
| size_t size_of_objects; |
| bool incremental_marking_stopped; |
| }; |
| |
| |
| // The idle time handler makes decisions about which garbage collection |
| // operations are executing during IdleNotification. |
| class V8_EXPORT_PRIVATE GCIdleTimeHandler { |
| public: |
| // If we haven't recorded any incremental marking events yet, we carefully |
| // mark with a conservative lower bound for the marking speed. |
| static const size_t kInitialConservativeMarkingSpeed = 100 * KB; |
| |
| // Maximum marking step size returned by EstimateMarkingStepSize. |
| static const size_t kMaximumMarkingStepSize = 700 * MB; |
| |
| // We have to make sure that we finish the IdleNotification before |
| // idle_time_in_ms. Hence, we conservatively prune our workload estimate. |
| static const double kConservativeTimeRatio; |
| |
| // This is the maximum scheduled idle time. Note that it can be more than |
| // 16.66 ms when there is currently no rendering going on. |
| static const size_t kMaxScheduledIdleTime = 50; |
| |
| static const size_t kMaxHeapSizeForContextDisposalMarkCompact = 100 * MB; |
| |
| // If contexts are disposed at a higher rate a full gc is triggered. |
| static const double kHighContextDisposalRate; |
| |
| GCIdleTimeHandler() = default; |
| |
| GCIdleTimeAction Compute(double idle_time_in_ms, |
| GCIdleTimeHeapState heap_state); |
| |
| bool Enabled(); |
| |
| static size_t EstimateMarkingStepSize(double idle_time_in_ms, |
| double marking_speed_in_bytes_per_ms); |
| |
| static double EstimateFinalIncrementalMarkCompactTime( |
| size_t size_of_objects, double mark_compact_speed_in_bytes_per_ms); |
| |
| static bool ShouldDoContextDisposalMarkCompact(int context_disposed, |
| double contexts_disposal_rate, |
| size_t size_of_objects); |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_HEAP_GC_IDLE_TIME_HANDLER_H_ |