| Index: src/heap/gc-tracer.cc
|
| diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc
|
| index c2f6ab6c9d04bde61c42df5d26f580731ca77ab5..93686ba85cbba178adc618153d6208d42e136b47 100644
|
| --- a/src/heap/gc-tracer.cc
|
| +++ b/src/heap/gc-tracer.cc
|
| @@ -68,6 +68,7 @@ const char* GCTracer::Event::TypeName(bool short_name) const {
|
| return "Scavenge";
|
| }
|
| case MARK_COMPACTOR:
|
| + case INCREMENTAL_MARK_COMPACTOR:
|
| if (short_name) {
|
| return "ms";
|
| } else {
|
| @@ -97,7 +98,7 @@ GCTracer::GCTracer(Heap* heap)
|
| start_counter_(0) {
|
| current_ = Event(Event::START, NULL, NULL);
|
| current_.end_time = base::OS::TimeCurrentMillis();
|
| - previous_ = previous_mark_compactor_event_ = current_;
|
| + previous_ = previous_incremental_mark_compactor_event_ = current_;
|
| }
|
|
|
|
|
| @@ -114,13 +115,18 @@ void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| reinterpret_cast<intptr_t>((heap_->new_space()->top()) -
|
| new_space_top_after_gc_));
|
| }
|
| - if (current_.type == Event::MARK_COMPACTOR)
|
| - previous_mark_compactor_event_ = current_;
|
| + if (current_.type == Event::INCREMENTAL_MARK_COMPACTOR)
|
| + previous_incremental_mark_compactor_event_ = current_;
|
|
|
| if (collector == SCAVENGER) {
|
| current_ = Event(Event::SCAVENGER, gc_reason, collector_reason);
|
| - } else {
|
| - current_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason);
|
| + } else if (collector == MARK_COMPACTOR) {
|
| + if (heap_->incremental_marking()->IsMarking()) {
|
| + current_ =
|
| + Event(Event::INCREMENTAL_MARK_COMPACTOR, gc_reason, collector_reason);
|
| + } else {
|
| + current_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason);
|
| + }
|
| }
|
|
|
| current_.start_time = start_time;
|
| @@ -158,9 +164,10 @@ void GCTracer::Stop(GarbageCollector collector) {
|
| }
|
|
|
| DCHECK(start_counter_ >= 0);
|
| - DCHECK(
|
| - (collector == SCAVENGER && current_.type == Event::SCAVENGER) ||
|
| - (collector == MARK_COMPACTOR && current_.type == Event::MARK_COMPACTOR));
|
| + DCHECK((collector == SCAVENGER && current_.type == Event::SCAVENGER) ||
|
| + (collector == MARK_COMPACTOR &&
|
| + (current_.type == Event::MARK_COMPACTOR ||
|
| + current_.type == Event::INCREMENTAL_MARK_COMPACTOR)));
|
|
|
| current_.end_time = base::OS::TimeCurrentMillis();
|
| current_.end_object_size = heap_->SizeOfObjects();
|
| @@ -183,21 +190,30 @@ void GCTracer::Stop(GarbageCollector collector) {
|
| current_.cumulative_pure_incremental_marking_duration -
|
| previous_.cumulative_pure_incremental_marking_duration;
|
| scavenger_events_.push_front(current_);
|
| - } else {
|
| + } else if (current_.type == Event::INCREMENTAL_MARK_COMPACTOR) {
|
| current_.incremental_marking_steps =
|
| current_.cumulative_incremental_marking_steps -
|
| - previous_mark_compactor_event_.cumulative_incremental_marking_steps;
|
| + previous_incremental_mark_compactor_event_
|
| + .cumulative_incremental_marking_steps;
|
| current_.incremental_marking_bytes =
|
| current_.cumulative_incremental_marking_bytes -
|
| - previous_mark_compactor_event_.cumulative_incremental_marking_bytes;
|
| + previous_incremental_mark_compactor_event_
|
| + .cumulative_incremental_marking_bytes;
|
| current_.incremental_marking_duration =
|
| current_.cumulative_incremental_marking_duration -
|
| - previous_mark_compactor_event_.cumulative_incremental_marking_duration;
|
| + previous_incremental_mark_compactor_event_
|
| + .cumulative_incremental_marking_duration;
|
| current_.pure_incremental_marking_duration =
|
| current_.cumulative_pure_incremental_marking_duration -
|
| - previous_mark_compactor_event_
|
| + previous_incremental_mark_compactor_event_
|
| .cumulative_pure_incremental_marking_duration;
|
| longest_incremental_marking_step_ = 0.0;
|
| + incremental_mark_compactor_events_.push_front(current_);
|
| + } else {
|
| + DCHECK(current_.incremental_marking_bytes == 0);
|
| + DCHECK(current_.incremental_marking_duration == 0);
|
| + DCHECK(current_.pure_incremental_marking_duration == 0);
|
| + DCHECK(longest_incremental_marking_step_ == 0.0);
|
| mark_compactor_events_.push_front(current_);
|
| }
|
|
|
| @@ -400,15 +416,15 @@ double GCTracer::MeanIncrementalMarkingDuration() const {
|
|
|
| // We haven't completed an entire round of incremental marking, yet.
|
| // Use data from GCTracer instead of data from event buffers.
|
| - if (mark_compactor_events_.empty()) {
|
| + if (incremental_mark_compactor_events_.empty()) {
|
| return cumulative_incremental_marking_duration_ /
|
| cumulative_incremental_marking_steps_;
|
| }
|
|
|
| int steps = 0;
|
| double durations = 0.0;
|
| - EventBuffer::const_iterator iter = mark_compactor_events_.begin();
|
| - while (iter != mark_compactor_events_.end()) {
|
| + EventBuffer::const_iterator iter = incremental_mark_compactor_events_.begin();
|
| + while (iter != incremental_mark_compactor_events_.end()) {
|
| steps += iter->incremental_marking_steps;
|
| durations += iter->incremental_marking_duration;
|
| ++iter;
|
| @@ -423,11 +439,12 @@ double GCTracer::MeanIncrementalMarkingDuration() const {
|
| double GCTracer::MaxIncrementalMarkingDuration() const {
|
| // We haven't completed an entire round of incremental marking, yet.
|
| // Use data from GCTracer instead of data from event buffers.
|
| - if (mark_compactor_events_.empty()) return longest_incremental_marking_step_;
|
| + if (incremental_mark_compactor_events_.empty())
|
| + return longest_incremental_marking_step_;
|
|
|
| double max_duration = 0.0;
|
| - EventBuffer::const_iterator iter = mark_compactor_events_.begin();
|
| - while (iter != mark_compactor_events_.end())
|
| + EventBuffer::const_iterator iter = incremental_mark_compactor_events_.begin();
|
| + while (iter != incremental_mark_compactor_events_.end())
|
| max_duration = Max(iter->longest_incremental_marking_step, max_duration);
|
|
|
| return max_duration;
|
| @@ -439,15 +456,15 @@ intptr_t GCTracer::IncrementalMarkingSpeedInBytesPerMillisecond() const {
|
|
|
| // We haven't completed an entire round of incremental marking, yet.
|
| // Use data from GCTracer instead of data from event buffers.
|
| - if (mark_compactor_events_.empty()) {
|
| + if (incremental_mark_compactor_events_.empty()) {
|
| return static_cast<intptr_t>(cumulative_incremental_marking_bytes_ /
|
| cumulative_pure_incremental_marking_duration_);
|
| }
|
|
|
| intptr_t bytes = 0;
|
| double durations = 0.0;
|
| - EventBuffer::const_iterator iter = mark_compactor_events_.begin();
|
| - while (iter != mark_compactor_events_.end()) {
|
| + EventBuffer::const_iterator iter = incremental_mark_compactor_events_.begin();
|
| + while (iter != incremental_mark_compactor_events_.end()) {
|
| bytes += iter->incremental_marking_bytes;
|
| durations += iter->pure_incremental_marking_duration;
|
| ++iter;
|
| @@ -481,8 +498,24 @@ intptr_t GCTracer::MarkCompactSpeedInBytesPerMillisecond() const {
|
| EventBuffer::const_iterator iter = mark_compactor_events_.begin();
|
| while (iter != mark_compactor_events_.end()) {
|
| bytes += iter->start_object_size;
|
| - durations += iter->end_time - iter->start_time +
|
| - iter->pure_incremental_marking_duration;
|
| + durations += iter->end_time - iter->start_time;
|
| + ++iter;
|
| + }
|
| +
|
| + if (durations == 0.0) return 0;
|
| +
|
| + return static_cast<intptr_t>(bytes / durations);
|
| +}
|
| +
|
| +
|
| +intptr_t GCTracer::FinalIncrementalMarkCompactSpeedInBytesPerMillisecond()
|
| + const {
|
| + intptr_t bytes = 0;
|
| + double durations = 0.0;
|
| + EventBuffer::const_iterator iter = incremental_mark_compactor_events_.begin();
|
| + while (iter != incremental_mark_compactor_events_.end()) {
|
| + bytes += iter->start_object_size;
|
| + durations += iter->end_time - iter->start_time;
|
| ++iter;
|
| }
|
|
|
|
|