| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/heap/gc-tracer.h" | 7 #include "src/heap/gc-tracer.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 | 86 |
| 87 GCTracer::GCTracer(Heap* heap) | 87 GCTracer::GCTracer(Heap* heap) |
| 88 : heap_(heap), | 88 : heap_(heap), |
| 89 cumulative_incremental_marking_steps_(0), | 89 cumulative_incremental_marking_steps_(0), |
| 90 cumulative_incremental_marking_bytes_(0), | 90 cumulative_incremental_marking_bytes_(0), |
| 91 cumulative_incremental_marking_duration_(0.0), | 91 cumulative_incremental_marking_duration_(0.0), |
| 92 cumulative_pure_incremental_marking_duration_(0.0), | 92 cumulative_pure_incremental_marking_duration_(0.0), |
| 93 longest_incremental_marking_step_(0.0), | 93 longest_incremental_marking_step_(0.0), |
| 94 cumulative_marking_duration_(0.0), | 94 cumulative_marking_duration_(0.0), |
| 95 cumulative_sweeping_duration_(0.0), | 95 cumulative_sweeping_duration_(0.0), |
| 96 new_space_top_after_gc_(0) { | 96 new_space_top_after_gc_(0), |
| 97 start_counter_(0) { |
| 97 current_ = Event(Event::START, NULL, NULL); | 98 current_ = Event(Event::START, NULL, NULL); |
| 98 current_.end_time = base::OS::TimeCurrentMillis(); | 99 current_.end_time = base::OS::TimeCurrentMillis(); |
| 99 previous_ = previous_mark_compactor_event_ = current_; | 100 previous_ = previous_mark_compactor_event_ = current_; |
| 100 } | 101 } |
| 101 | 102 |
| 102 | 103 |
| 103 void GCTracer::Start(GarbageCollector collector, const char* gc_reason, | 104 void GCTracer::Start(GarbageCollector collector, const char* gc_reason, |
| 104 const char* collector_reason) { | 105 const char* collector_reason) { |
| 106 start_counter_++; |
| 107 if (start_counter_ != 1) return; |
| 108 |
| 105 previous_ = current_; | 109 previous_ = current_; |
| 106 double start_time = base::OS::TimeCurrentMillis(); | 110 double start_time = base::OS::TimeCurrentMillis(); |
| 107 if (new_space_top_after_gc_ != 0) { | 111 if (new_space_top_after_gc_ != 0) { |
| 108 AddNewSpaceAllocationTime( | 112 AddNewSpaceAllocationTime( |
| 109 start_time - previous_.end_time, | 113 start_time - previous_.end_time, |
| 110 reinterpret_cast<intptr_t>((heap_->new_space()->top()) - | 114 reinterpret_cast<intptr_t>((heap_->new_space()->top()) - |
| 111 new_space_top_after_gc_)); | 115 new_space_top_after_gc_)); |
| 112 } | 116 } |
| 113 if (current_.type == Event::MARK_COMPACTOR) | 117 if (current_.type == Event::MARK_COMPACTOR) |
| 114 previous_mark_compactor_event_ = current_; | 118 previous_mark_compactor_event_ = current_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 135 current_.cumulative_pure_incremental_marking_duration = | 139 current_.cumulative_pure_incremental_marking_duration = |
| 136 cumulative_pure_incremental_marking_duration_; | 140 cumulative_pure_incremental_marking_duration_; |
| 137 current_.longest_incremental_marking_step = longest_incremental_marking_step_; | 141 current_.longest_incremental_marking_step = longest_incremental_marking_step_; |
| 138 | 142 |
| 139 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { | 143 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { |
| 140 current_.scopes[i] = 0; | 144 current_.scopes[i] = 0; |
| 141 } | 145 } |
| 142 } | 146 } |
| 143 | 147 |
| 144 | 148 |
| 145 void GCTracer::Stop() { | 149 void GCTracer::Stop(GarbageCollector collector) { |
| 150 start_counter_--; |
| 151 if (start_counter_ != 0) { |
| 152 if (FLAG_trace_gc) { |
| 153 PrintF("[Finished reentrant %s during %s.]\n", |
| 154 collector == SCAVENGER ? "Scavenge" : "Mark-sweep", |
| 155 current_.TypeName(false)); |
| 156 } |
| 157 return; |
| 158 } |
| 159 |
| 160 DCHECK(start_counter_ >= 0); |
| 161 DCHECK( |
| 162 (collector == SCAVENGER && current_.type == Event::SCAVENGER) || |
| 163 (collector == MARK_COMPACTOR && current_.type == Event::MARK_COMPACTOR)); |
| 164 |
| 146 current_.end_time = base::OS::TimeCurrentMillis(); | 165 current_.end_time = base::OS::TimeCurrentMillis(); |
| 147 current_.end_object_size = heap_->SizeOfObjects(); | 166 current_.end_object_size = heap_->SizeOfObjects(); |
| 148 current_.end_memory_size = heap_->isolate()->memory_allocator()->Size(); | 167 current_.end_memory_size = heap_->isolate()->memory_allocator()->Size(); |
| 149 current_.end_holes_size = CountTotalHolesSize(heap_); | 168 current_.end_holes_size = CountTotalHolesSize(heap_); |
| 150 new_space_top_after_gc_ = | 169 new_space_top_after_gc_ = |
| 151 reinterpret_cast<intptr_t>(heap_->new_space()->top()); | 170 reinterpret_cast<intptr_t>(heap_->new_space()->top()); |
| 152 | 171 |
| 153 if (current_.type == Event::SCAVENGER) { | 172 if (current_.type == Event::SCAVENGER) { |
| 154 current_.incremental_marking_steps = | 173 current_.incremental_marking_steps = |
| 155 current_.cumulative_incremental_marking_steps - | 174 current_.cumulative_incremental_marking_steps - |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 context_disposal_events_.begin(); | 517 context_disposal_events_.begin(); |
| 499 while (iter != context_disposal_events_.end()) { | 518 while (iter != context_disposal_events_.end()) { |
| 500 end = iter->time_; | 519 end = iter->time_; |
| 501 ++iter; | 520 ++iter; |
| 502 } | 521 } |
| 503 | 522 |
| 504 return (begin - end) / context_disposal_events_.size(); | 523 return (begin - end) / context_disposal_events_.size(); |
| 505 } | 524 } |
| 506 } | 525 } |
| 507 } // namespace v8::internal | 526 } // namespace v8::internal |
| OLD | NEW |