Index: src/heap/gc-tracer.cc |
diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc |
index 49f687990b8689e446f6192ae6c9a5f3e6e0777d..703b57b2b3c6672f16a4ddfdf090a2b52e86f5b8 100644 |
--- a/src/heap/gc-tracer.cc |
+++ b/src/heap/gc-tracer.cc |
@@ -84,28 +84,17 @@ GCTracer::Event::Event(Type type, GarbageCollectionReason gc_reason, |
} |
} |
- |
const char* GCTracer::Event::TypeName(bool short_name) const { |
switch (type) { |
case SCAVENGER: |
- if (short_name) { |
- return "s"; |
- } else { |
- return "Scavenge"; |
- } |
+ return (short_name) ? "s" : "Scavenge"; |
case MARK_COMPACTOR: |
case INCREMENTAL_MARK_COMPACTOR: |
- if (short_name) { |
- return "ms"; |
- } else { |
- return "Mark-sweep"; |
- } |
+ return (short_name) ? "ms" : "Mark-sweep"; |
+ case MINOR_MARK_COMPACTOR: |
+ return (short_name) ? "mmc" : "Minor Mark-Compact"; |
case START: |
- if (short_name) { |
- return "st"; |
- } else { |
- return "Start"; |
- } |
+ return (short_name) ? "st" : "Start"; |
} |
return "Unknown Event Type"; |
} |
@@ -116,6 +105,7 @@ GCTracer::GCTracer(Heap* heap) |
previous_(current_), |
incremental_marking_bytes_(0), |
incremental_marking_duration_(0.0), |
+ incremental_marking_start_time_(0.0), |
recorded_incremental_marking_speed_(0.0), |
allocation_time_ms_(0.0), |
new_space_allocation_counter_bytes_(0), |
@@ -140,8 +130,8 @@ void GCTracer::ResetForTesting() { |
new_space_allocation_in_bytes_since_gc_ = 0.0; |
old_generation_allocation_in_bytes_since_gc_ = 0.0; |
combined_mark_compact_speed_cache_ = 0.0; |
- recorded_scavenges_total_.Reset(); |
- recorded_scavenges_survived_.Reset(); |
+ recorded_minor_gcs_total_.Reset(); |
+ recorded_minor_gcs_survived_.Reset(); |
recorded_compactions_.Reset(); |
recorded_mark_compacts_.Reset(); |
recorded_incremental_mark_compacts_.Reset(); |
@@ -163,15 +153,22 @@ void GCTracer::Start(GarbageCollector collector, |
SampleAllocation(start_time, heap_->NewSpaceAllocationCounter(), |
heap_->OldGenerationAllocationCounter()); |
- if (collector == SCAVENGER) { |
- current_ = Event(Event::SCAVENGER, gc_reason, collector_reason); |
- } else if (collector == MARK_COMPACTOR) { |
- if (heap_->incremental_marking()->WasActivated()) { |
+ switch (collector) { |
+ case SCAVENGER: |
+ current_ = Event(Event::SCAVENGER, gc_reason, collector_reason); |
+ break; |
+ case MINOR_MARK_COMPACTOR: |
current_ = |
- Event(Event::INCREMENTAL_MARK_COMPACTOR, gc_reason, collector_reason); |
- } else { |
- current_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason); |
- } |
+ Event(Event::MINOR_MARK_COMPACTOR, gc_reason, collector_reason); |
+ break; |
+ case MARK_COMPACTOR: |
+ if (heap_->incremental_marking()->WasActivated()) { |
+ current_ = Event(Event::INCREMENTAL_MARK_COMPACTOR, gc_reason, |
+ collector_reason); |
+ } else { |
+ current_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason); |
+ } |
+ break; |
} |
current_.reduce_memory = heap_->ShouldReduceMemory(); |
@@ -194,7 +191,7 @@ void GCTracer::Start(GarbageCollector collector, |
Counters* counters = heap_->isolate()->counters(); |
- if (collector == SCAVENGER) { |
+ if (Heap::IsYoungGenerationCollector(collector)) { |
counters->scavenge_reason()->AddSample(static_cast<int>(gc_reason)); |
} else { |
counters->mark_compact_reason()->AddSample(static_cast<int>(gc_reason)); |
@@ -220,15 +217,16 @@ void GCTracer::ResetIncrementalMarkingCounters() { |
void GCTracer::Stop(GarbageCollector collector) { |
start_counter_--; |
if (start_counter_ != 0) { |
- heap_->isolate()->PrintWithTimestamp( |
- "[Finished reentrant %s during %s.]\n", |
- collector == SCAVENGER ? "Scavenge" : "Mark-sweep", |
- current_.TypeName(false)); |
+ heap_->isolate()->PrintWithTimestamp("[Finished reentrant %s during %s.]\n", |
+ Heap::CollectorName(collector), |
+ current_.TypeName(false)); |
return; |
} |
DCHECK(start_counter_ >= 0); |
DCHECK((collector == SCAVENGER && current_.type == Event::SCAVENGER) || |
+ (collector == MINOR_MARK_COMPACTOR && |
+ current_.type == Event::MINOR_MARK_COMPACTOR) || |
(collector == MARK_COMPACTOR && |
(current_.type == Event::MARK_COMPACTOR || |
current_.type == Event::INCREMENTAL_MARK_COMPACTOR))); |
@@ -250,36 +248,45 @@ void GCTracer::Stop(GarbageCollector collector) { |
double duration = current_.end_time - current_.start_time; |
- if (current_.type == Event::SCAVENGER) { |
- recorded_scavenges_total_.Push( |
- MakeBytesAndDuration(current_.new_space_object_size, duration)); |
- recorded_scavenges_survived_.Push(MakeBytesAndDuration( |
- current_.survived_new_space_object_size, duration)); |
- } else if (current_.type == Event::INCREMENTAL_MARK_COMPACTOR) { |
- current_.incremental_marking_bytes = incremental_marking_bytes_; |
- current_.incremental_marking_duration = incremental_marking_duration_; |
- for (int i = 0; i < Scope::NUMBER_OF_INCREMENTAL_SCOPES; i++) { |
- current_.incremental_marking_scopes[i] = incremental_marking_scopes_[i]; |
- current_.scopes[i] = incremental_marking_scopes_[i].duration; |
- } |
- RecordIncrementalMarkingSpeed(current_.incremental_marking_bytes, |
- current_.incremental_marking_duration); |
- recorded_incremental_mark_compacts_.Push( |
- MakeBytesAndDuration(current_.start_object_size, duration)); |
- ResetIncrementalMarkingCounters(); |
- combined_mark_compact_speed_cache_ = 0.0; |
- } else { |
- DCHECK_EQ(0u, current_.incremental_marking_bytes); |
- DCHECK_EQ(0, current_.incremental_marking_duration); |
- recorded_mark_compacts_.Push( |
- MakeBytesAndDuration(current_.start_object_size, duration)); |
- ResetIncrementalMarkingCounters(); |
- combined_mark_compact_speed_cache_ = 0.0; |
+ switch (current_.type) { |
+ case Event::SCAVENGER: |
+ case Event::MINOR_MARK_COMPACTOR: |
+ recorded_minor_gcs_total_.Push( |
+ MakeBytesAndDuration(current_.new_space_object_size, duration)); |
+ recorded_minor_gcs_survived_.Push(MakeBytesAndDuration( |
+ current_.survived_new_space_object_size, duration)); |
+ break; |
+ case Event::INCREMENTAL_MARK_COMPACTOR: |
+ current_.incremental_marking_bytes = incremental_marking_bytes_; |
+ current_.incremental_marking_duration = incremental_marking_duration_; |
+ for (int i = 0; i < Scope::NUMBER_OF_INCREMENTAL_SCOPES; i++) { |
+ current_.incremental_marking_scopes[i] = incremental_marking_scopes_[i]; |
+ current_.scopes[i] = incremental_marking_scopes_[i].duration; |
+ } |
+ RecordIncrementalMarkingSpeed(current_.incremental_marking_bytes, |
+ current_.incremental_marking_duration); |
+ recorded_incremental_mark_compacts_.Push( |
+ MakeBytesAndDuration(current_.start_object_size, duration)); |
+ ResetIncrementalMarkingCounters(); |
+ combined_mark_compact_speed_cache_ = 0.0; |
+ break; |
+ case Event::MARK_COMPACTOR: |
+ DCHECK_EQ(0u, current_.incremental_marking_bytes); |
+ DCHECK_EQ(0, current_.incremental_marking_duration); |
+ recorded_mark_compacts_.Push( |
+ MakeBytesAndDuration(current_.start_object_size, duration)); |
+ ResetIncrementalMarkingCounters(); |
+ combined_mark_compact_speed_cache_ = 0.0; |
+ break; |
+ case Event::START: |
+ UNREACHABLE(); |
} |
heap_->UpdateTotalGCTime(duration); |
- if (current_.type == Event::SCAVENGER && FLAG_trace_gc_ignore_scavenger) |
+ if ((current_.type == Event::SCAVENGER || |
+ current_.type == Event::MINOR_MARK_COMPACTOR) && |
+ FLAG_trace_gc_ignore_scavenger) |
return; |
if (FLAG_trace_gc_nvp) { |
@@ -500,6 +507,15 @@ void GCTracer::PrintNVP() const { |
NewSpaceAllocationThroughputInBytesPerMillisecond(), |
ContextDisposalRateInMilliseconds()); |
break; |
+ case Event::MINOR_MARK_COMPACTOR: |
+ heap_->isolate()->PrintWithTimestamp( |
+ "pause=%.1f " |
+ "mutator=%.1f " |
+ "gc=%s " |
+ "reduce_memory=%d\n", |
+ duration, spent_in_mutator, current_.TypeName(true), |
+ current_.reduce_memory); |
+ break; |
case Event::MARK_COMPACTOR: |
case Event::INCREMENTAL_MARK_COMPACTOR: |
heap_->isolate()->PrintWithTimestamp( |
@@ -721,9 +737,9 @@ double GCTracer::IncrementalMarkingSpeedInBytesPerMillisecond() const { |
double GCTracer::ScavengeSpeedInBytesPerMillisecond( |
ScavengeSpeedMode mode) const { |
if (mode == kForAllObjects) { |
- return AverageSpeed(recorded_scavenges_total_); |
+ return AverageSpeed(recorded_minor_gcs_total_); |
} else { |
- return AverageSpeed(recorded_scavenges_survived_); |
+ return AverageSpeed(recorded_minor_gcs_survived_); |
} |
} |