| Index: src/heap/gc-tracer.h
|
| diff --git a/src/heap/gc-tracer.h b/src/heap/gc-tracer.h
|
| index 531bba3cea78090e3cc47c5c48e54f3d0547655a..a11823e984f63ba1f25c3ddcca0c607e81571b50 100644
|
| --- a/src/heap/gc-tracer.h
|
| +++ b/src/heap/gc-tracer.h
|
| @@ -60,12 +60,15 @@ inline BytesAndDuration MakeBytesAndDuration(uint64_t bytes, double duration) {
|
|
|
| enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects };
|
|
|
| -#define INCREMENTAL_SCOPES(F) \
|
| - F(MC_INCREMENTAL_WRAPPER_PROLOGUE) \
|
| - F(MC_INCREMENTAL_WRAPPER_TRACING) \
|
| - F(MC_INCREMENTAL_FINALIZE) \
|
| - F(MC_INCREMENTAL_FINALIZE_OBJECT_GROUPING) \
|
| - F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \
|
| +#define INCREMENTAL_SCOPES(F) \
|
| + /* MC_INCREMENTAL is the top-level incremental marking scope. */ \
|
| + F(MC_INCREMENTAL) \
|
| + F(MC_INCREMENTAL_WRAPPER_PROLOGUE) \
|
| + F(MC_INCREMENTAL_WRAPPER_TRACING) \
|
| + F(MC_INCREMENTAL_FINALIZE) \
|
| + F(MC_INCREMENTAL_FINALIZE_BODY) \
|
| + F(MC_INCREMENTAL_FINALIZE_OBJECT_GROUPING) \
|
| + F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \
|
| F(MC_INCREMENTAL_EXTERNAL_PROLOGUE)
|
|
|
| #define TRACER_SCOPES(F) \
|
| @@ -128,9 +131,30 @@ enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects };
|
|
|
| // GCTracer collects and prints ONE line after each garbage collector
|
| // invocation IFF --trace_gc is used.
|
| -// TODO(ernstm): Unit tests.
|
| class GCTracer {
|
| public:
|
| + struct IncrementalMarkingInfos {
|
| + IncrementalMarkingInfos()
|
| + : cumulative_duration(0), longest_step(0), steps(0) {}
|
| +
|
| + void Update(double duration) {
|
| + steps++;
|
| + cumulative_duration += duration;
|
| + if (duration > longest_step) {
|
| + longest_step = duration;
|
| + }
|
| + }
|
| +
|
| + void ResetCurrentCycle() {
|
| + longest_step = 0;
|
| + steps = 0;
|
| + }
|
| +
|
| + double cumulative_duration;
|
| + double longest_step;
|
| + int steps;
|
| + };
|
| +
|
| class Scope {
|
| public:
|
| enum ScopeId {
|
| @@ -139,7 +163,7 @@ class GCTracer {
|
| #undef DEFINE_SCOPE
|
| NUMBER_OF_SCOPES,
|
|
|
| - FIRST_INCREMENTAL_SCOPE = MC_INCREMENTAL_WRAPPER_PROLOGUE,
|
| + FIRST_INCREMENTAL_SCOPE = MC_INCREMENTAL,
|
| LAST_INCREMENTAL_SCOPE = MC_INCREMENTAL_EXTERNAL_PROLOGUE,
|
| NUMBER_OF_INCREMENTAL_SCOPES =
|
| LAST_INCREMENTAL_SCOPE - FIRST_INCREMENTAL_SCOPE + 1
|
| @@ -168,9 +192,6 @@ class GCTracer {
|
| START = 3
|
| };
|
|
|
| - // Default constructor leaves the event uninitialized.
|
| - Event() {}
|
| -
|
| Event(Type type, const char* gc_reason, const char* collector_reason);
|
|
|
| // Returns a string describing the event type.
|
| @@ -213,19 +234,10 @@ class GCTracer {
|
|
|
| // Size of new space objects in constructor.
|
| intptr_t new_space_object_size;
|
| +
|
| // Size of survived new space objects in destructor.
|
| intptr_t survived_new_space_object_size;
|
|
|
| - // Number of incremental marking steps since creation of tracer.
|
| - // (value at start of event)
|
| - int cumulative_incremental_marking_steps;
|
| -
|
| - // Incremental marking steps since
|
| - // - last event for SCAVENGER events
|
| - // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR
|
| - // events
|
| - int incremental_marking_steps;
|
| -
|
| // Bytes marked since creation of tracer (value at start of event).
|
| intptr_t cumulative_incremental_marking_bytes;
|
|
|
| @@ -235,16 +247,6 @@ class GCTracer {
|
| // events
|
| intptr_t incremental_marking_bytes;
|
|
|
| - // Cumulative duration of incremental marking steps since creation of
|
| - // tracer. (value at start of event)
|
| - double cumulative_incremental_marking_duration;
|
| -
|
| - // Duration of incremental marking steps since
|
| - // - last event for SCAVENGER events
|
| - // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR
|
| - // events
|
| - double incremental_marking_duration;
|
| -
|
| // Cumulative pure duration of incremental marking steps since creation of
|
| // tracer. (value at start of event)
|
| double cumulative_pure_incremental_marking_duration;
|
| @@ -255,37 +257,12 @@ class GCTracer {
|
| // events
|
| double pure_incremental_marking_duration;
|
|
|
| - // Longest incremental marking step since start of marking (start of event).
|
| - double longest_incremental_marking_step;
|
| -
|
| - // Number of incremental marking finalization steps since creation of
|
| - // tracer.
|
| - int cumulative_incremental_marking_finalization_steps;
|
| -
|
| - // Cumulative pure duration of incremental marking steps since creation of
|
| - // tracer. (value at start of event)
|
| - double cumulative_incremental_marking_finalizaton_duration;
|
| -
|
| - // Longest incremental marking finalization step since start of marking
|
| - // (start of event).
|
| - double longest_incremental_marking_finalization_step;
|
| -
|
| - // Incremental marking finalization steps since
|
| - // - last event for SCAVENGER events
|
| - // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR
|
| - // events
|
| - int incremental_marking_finalizaton_steps;
|
| -
|
| - // Duration of incremental marking finalization steps since
|
| - // - last event for SCAVENGER events
|
| - // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR
|
| - // events
|
| - double incremental_marking_finalization_duration;
|
| -
|
| - double cumulative_incremental_scopes[Scope::NUMBER_OF_INCREMENTAL_SCOPES];
|
| -
|
| // Amounts of time spent in different scopes during GC.
|
| double scopes[Scope::NUMBER_OF_SCOPES];
|
| +
|
| + // Holds details for incremental marking scopes.
|
| + IncrementalMarkingInfos
|
| + incremental_marking_scopes[Scope::NUMBER_OF_INCREMENTAL_SCOPES];
|
| };
|
|
|
| static const int kThroughputTimeFrameMs = 5000;
|
| @@ -315,8 +292,6 @@ class GCTracer {
|
| // Log an incremental marking step.
|
| void AddIncrementalMarkingStep(double duration, intptr_t bytes);
|
|
|
| - void AddIncrementalMarkingFinalizationStep(double duration);
|
| -
|
| // Log time spent in marking.
|
| void AddMarkingTime(double duration) {
|
| cumulative_marking_duration_ += duration;
|
| @@ -406,7 +381,15 @@ class GCTracer {
|
| // Discard all recorded survival events.
|
| void ResetSurvivalEvents();
|
|
|
| - void AddScopeSample(Scope::ScopeId scope, double duration);
|
| + V8_INLINE void AddScopeSample(Scope::ScopeId scope, double duration) {
|
| + DCHECK(scope < Scope::NUMBER_OF_SCOPES);
|
| + if (scope >= Scope::FIRST_INCREMENTAL_SCOPE &&
|
| + scope <= Scope::LAST_INCREMENTAL_SCOPE) {
|
| + incremental_marking_scopes_[scope].Update(duration);
|
| + } else {
|
| + current_.scopes[scope] += duration;
|
| + }
|
| + }
|
|
|
| private:
|
| FRIEND_TEST(GCTracer, AverageSpeed);
|
| @@ -415,6 +398,7 @@ class GCTracer {
|
| FRIEND_TEST(GCTracerTest, NewSpaceAllocationThroughputWithProvidedTime);
|
| FRIEND_TEST(GCTracerTest, OldGenerationAllocationThroughputWithProvidedTime);
|
| FRIEND_TEST(GCTracerTest, RegularScope);
|
| + FRIEND_TEST(GCTracerTest, IncrementalMarkingDetails);
|
| FRIEND_TEST(GCTracerTest, IncrementalScope);
|
|
|
| // Returns the average speed of the events in the buffer.
|
| @@ -424,6 +408,8 @@ class GCTracer {
|
| static double AverageSpeed(const RingBuffer<BytesAndDuration>& buffer,
|
| const BytesAndDuration& initial, double time_ms);
|
|
|
| + void MergeBaseline(const Event& baseline);
|
| +
|
| void ResetForTesting();
|
|
|
| // Print one detailed trace line in name=value format.
|
| @@ -438,19 +424,6 @@ class GCTracer {
|
| // it can be included in later crash dumps.
|
| void PRINTF_FORMAT(2, 3) Output(const char* format, ...) const;
|
|
|
| - void ClearMarkCompactStatistics() {
|
| - cumulative_incremental_marking_steps_ = 0;
|
| - cumulative_incremental_marking_bytes_ = 0;
|
| - cumulative_incremental_marking_duration_ = 0;
|
| - cumulative_pure_incremental_marking_duration_ = 0;
|
| - longest_incremental_marking_step_ = 0;
|
| - cumulative_incremental_marking_finalization_steps_ = 0;
|
| - cumulative_incremental_marking_finalization_duration_ = 0;
|
| - longest_incremental_marking_finalization_step_ = 0;
|
| - cumulative_marking_duration_ = 0;
|
| - cumulative_sweeping_duration_ = 0;
|
| - }
|
| -
|
| double TotalExternalTime() const {
|
| return current_.scopes[Scope::EXTERNAL_WEAK_GLOBAL_HANDLES] +
|
| current_.scopes[Scope::MC_EXTERNAL_EPILOGUE] +
|
| @@ -474,9 +447,6 @@ class GCTracer {
|
| // Previous INCREMENTAL_MARK_COMPACTOR event.
|
| Event previous_incremental_mark_compactor_event_;
|
|
|
| - // Cumulative number of incremental marking steps since creation of tracer.
|
| - int cumulative_incremental_marking_steps_;
|
| -
|
| // Cumulative size of incremental marking steps (in bytes) since creation of
|
| // tracer.
|
| intptr_t cumulative_incremental_marking_bytes_;
|
| @@ -488,27 +458,14 @@ class GCTracer {
|
| // tracer.
|
| double cumulative_pure_incremental_marking_duration_;
|
|
|
| - // Longest incremental marking step since start of marking.
|
| - double longest_incremental_marking_step_;
|
| -
|
| - // Cumulative number of incremental marking finalization steps since creation
|
| - // of tracer.
|
| - int cumulative_incremental_marking_finalization_steps_;
|
| -
|
| - // Cumulative duration of incremental marking finalization steps since
|
| - // creation of tracer.
|
| - double cumulative_incremental_marking_finalization_duration_;
|
| -
|
| - // Longest incremental marking finalization step since start of marking.
|
| - double longest_incremental_marking_finalization_step_;
|
| -
|
| // Total marking time.
|
| // This timer is precise when run with --print-cumulative-gc-stat
|
| double cumulative_marking_duration_;
|
|
|
| - // Cumulative duration of incremental marking scopes since the creation of
|
| - // the tracer.
|
| - double cumulative_incremental_scopes_[Scope::NUMBER_OF_INCREMENTAL_SCOPES];
|
| + // Incremental scopes carry more information than just the duration. The infos
|
| + // here are merged back upon starting/stopping the GC tracer.
|
| + IncrementalMarkingInfos
|
| + incremental_marking_scopes_[Scope::NUMBER_OF_INCREMENTAL_SCOPES];
|
|
|
| // Total sweeping time on the main thread.
|
| // This timer is precise when run with --print-cumulative-gc-stat
|
|
|