Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(642)

Side by Side Diff: src/heap.cc

Issue 391413006: Track history of events in GCTracer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: RingBuffer fixes and unit test. Event::Type. Separte ring buffer members. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/once.h" 9 #include "src/base/once.h"
10 #include "src/base/utils/random-number-generator.h" 10 #include "src/base/utils/random-number-generator.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 semi_space_copied_object_size_(0), 106 semi_space_copied_object_size_(0),
107 semi_space_copied_rate_(0), 107 semi_space_copied_rate_(0),
108 nodes_died_in_new_space_(0), 108 nodes_died_in_new_space_(0),
109 nodes_copied_in_new_space_(0), 109 nodes_copied_in_new_space_(0),
110 nodes_promoted_(0), 110 nodes_promoted_(0),
111 maximum_size_scavenges_(0), 111 maximum_size_scavenges_(0),
112 max_gc_pause_(0.0), 112 max_gc_pause_(0.0),
113 total_gc_time_ms_(0.0), 113 total_gc_time_ms_(0.0),
114 max_alive_after_gc_(0), 114 max_alive_after_gc_(0),
115 min_in_mutator_(kMaxInt), 115 min_in_mutator_(kMaxInt),
116 alive_after_last_gc_(0),
117 last_gc_end_timestamp_(base::OS::TimeCurrentMillis()),
118 marking_time_(0.0), 116 marking_time_(0.0),
119 sweeping_time_(0.0), 117 sweeping_time_(0.0),
120 mark_compact_collector_(this), 118 mark_compact_collector_(this),
121 store_buffer_(this), 119 store_buffer_(this),
122 marking_(this), 120 marking_(this),
123 incremental_marking_(this), 121 incremental_marking_(this),
124 number_idle_notifications_(0), 122 number_idle_notifications_(0),
125 last_idle_notification_gc_count_(0), 123 last_idle_notification_gc_count_(0),
126 last_idle_notification_gc_count_init_(false), 124 last_idle_notification_gc_count_init_(false),
127 mark_sweeps_since_idle_round_started_(0), 125 mark_sweeps_since_idle_round_started_(0),
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 if (FLAG_trace_incremental_marking) { 831 if (FLAG_trace_incremental_marking) {
834 PrintF("[IncrementalMarking] Delaying MarkSweep.\n"); 832 PrintF("[IncrementalMarking] Delaying MarkSweep.\n");
835 } 833 }
836 collector = SCAVENGER; 834 collector = SCAVENGER;
837 collector_reason = "incremental marking delaying mark-sweep"; 835 collector_reason = "incremental marking delaying mark-sweep";
838 } 836 }
839 } 837 }
840 838
841 bool next_gc_likely_to_collect_more = false; 839 bool next_gc_likely_to_collect_more = false;
842 840
843 { tracer()->start(collector, gc_reason, collector_reason); 841 { tracer()->Start(collector, gc_reason, collector_reason);
844 ASSERT(AllowHeapAllocation::IsAllowed()); 842 ASSERT(AllowHeapAllocation::IsAllowed());
845 DisallowHeapAllocation no_allocation_during_gc; 843 DisallowHeapAllocation no_allocation_during_gc;
846 GarbageCollectionPrologue(); 844 GarbageCollectionPrologue();
847 845
848 { 846 {
849 HistogramTimerScope histogram_timer_scope( 847 HistogramTimerScope histogram_timer_scope(
850 (collector == SCAVENGER) ? isolate_->counters()->gc_scavenger() 848 (collector == SCAVENGER) ? isolate_->counters()->gc_scavenger()
851 : isolate_->counters()->gc_compactor()); 849 : isolate_->counters()->gc_compactor());
852 next_gc_likely_to_collect_more = 850 next_gc_likely_to_collect_more =
853 PerformGarbageCollection(collector, gc_callback_flags); 851 PerformGarbageCollection(collector, gc_callback_flags);
854 } 852 }
855 853
856 GarbageCollectionEpilogue(); 854 GarbageCollectionEpilogue();
857 tracer()->stop(); 855 tracer()->Stop();
858 } 856 }
859 857
860 // Start incremental marking for the next cycle. The heap snapshot 858 // Start incremental marking for the next cycle. The heap snapshot
861 // generator needs incremental marking to stay off after it aborted. 859 // generator needs incremental marking to stay off after it aborted.
862 if (!mark_compact_collector()->abort_incremental_marking() && 860 if (!mark_compact_collector()->abort_incremental_marking() &&
863 incremental_marking()->IsStopped() && 861 incremental_marking()->IsStopped() &&
864 incremental_marking()->WorthActivating() && 862 incremental_marking()->WorthActivating() &&
865 NextGCIsLikelyToBeFull()) { 863 NextGCIsLikelyToBeFull()) {
866 incremental_marking()->Start(); 864 incremental_marking()->Start();
867 } 865 }
(...skipping 5083 matching lines...) Expand 10 before | Expand all | Expand 10 after
5951 OldSpaces spaces(heap); 5949 OldSpaces spaces(heap);
5952 for (OldSpace* space = spaces.next(); 5950 for (OldSpace* space = spaces.next();
5953 space != NULL; 5951 space != NULL;
5954 space = spaces.next()) { 5952 space = spaces.next()) {
5955 holes_size += space->Waste() + space->Available(); 5953 holes_size += space->Waste() + space->Available();
5956 } 5954 }
5957 return holes_size; 5955 return holes_size;
5958 } 5956 }
5959 5957
5960 5958
5961 void Heap::UpdateGCStatistics(double start_time, 5959 void Heap::UpdateCumulativeGCStatistics(double duration,
5962 double end_time, 5960 double spent_in_mutator,
5963 double spent_in_mutator, 5961 double marking_time) {
5964 double marking_time) {
5965 double duration = end_time - start_time;
5966 alive_after_last_gc_ = SizeOfObjects();
5967 last_gc_end_timestamp_ = end_time;
5968
5969 if (FLAG_print_cumulative_gc_stat) { 5962 if (FLAG_print_cumulative_gc_stat) {
5970 total_gc_time_ms_ += duration; 5963 total_gc_time_ms_ += duration;
5971 max_gc_pause_ = Max(max_gc_pause_, duration); 5964 max_gc_pause_ = Max(max_gc_pause_, duration);
5972 max_alive_after_gc_ = Max(max_alive_after_gc_, alive_after_last_gc_); 5965 max_alive_after_gc_ = Max(max_alive_after_gc_, SizeOfObjects());
5973 min_in_mutator_ = Min(min_in_mutator_, spent_in_mutator); 5966 min_in_mutator_ = Min(min_in_mutator_, spent_in_mutator);
5974 } else if (FLAG_trace_gc_verbose) { 5967 } else if (FLAG_trace_gc_verbose) {
5975 total_gc_time_ms_ += duration; 5968 total_gc_time_ms_ += duration;
5976 } 5969 }
5977 5970
5978 marking_time_ += marking_time; 5971 marking_time_ += marking_time;
5979 } 5972 }
5980 5973
5974 GCTracer::Event::Event()
Hannes Payer (out of office) 2014/07/22 15:21:30 Why do we need the default constructor?
ernstm 2014/07/22 15:57:24 RingBuffer allocates an array of Events. The defau
Hannes Payer (out of office) 2014/07/22 16:29:12 Yes, I overlooked this one. Fine.
5975 : type(Event::INVALID),
5976 gc_reason(NULL),
5977 collector_reason(NULL),
5978 start_time(0.0),
5979 end_time(0.0),
5980 start_object_size(0),
5981 end_object_size(0),
5982 start_memory_size(0),
5983 end_memory_size(0),
5984 start_holes_size(0),
5985 end_holes_size(0),
5986 incremental_marking_steps(0),
5987 incremental_marking_duration(0.0) {
5988 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) {
5989 scopes[i] = 0;
5990 }
5991 }
5992
5993 GCTracer::Event::Event(Type type,
5994 const char* gc_reason,
5995 const char* collector_reason)
5996 : type(type),
5997 gc_reason(gc_reason),
5998 collector_reason(collector_reason),
5999 start_time(0.0),
6000 end_time(0.0),
6001 start_object_size(0),
6002 end_object_size(0),
6003 start_memory_size(0),
6004 end_memory_size(0),
6005 start_holes_size(0),
6006 end_holes_size(0),
6007 incremental_marking_steps(0),
6008 incremental_marking_duration(0.0) {
6009 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) {
6010 scopes[i] = 0;
6011 }
6012 }
6013
6014
6015 const char* GCTracer::Event::TypeName(bool short_name) const {
6016 switch (type) {
6017 case SCAVENGER:
6018 if (short_name)
6019 return "s";
6020 else
6021 return "Scavenge";
6022 case MARK_COMPACTOR:
6023 if (short_name)
6024 return "ms";
6025 else
6026 return "Mark-sweep";
6027 case ANCHOR:
6028 if (short_name)
6029 return "a";
6030 else
6031 return "Anchor";
6032 case INVALID:
6033 if (short_name)
6034 return "i";
6035 else
6036 return "Invalid";
6037 }
6038 return "Unknown Event Type";
6039 }
6040
5981 6041
5982 GCTracer::GCTracer(Heap* heap) 6042 GCTracer::GCTracer(Heap* heap)
5983 : start_time_(0.0), 6043 : heap_(heap),
5984 end_time_(0.0), 6044 incremental_marking_steps_(0),
5985 start_object_size_(0), 6045 incremental_marking_duration_(0.0),
5986 end_object_size_(0), 6046 longest_incremental_marking_step_(0.0) {
5987 start_memory_size_(0), 6047 Event anchor_event(Event::ANCHOR, NULL, NULL);
5988 end_memory_size_(0), 6048 anchor_event.end_time = base::OS::TimeCurrentMillis();
5989 in_free_list_or_wasted_before_gc_(0), 6049 scavenger_events_.push_back(anchor_event);
5990 allocated_since_last_gc_(0), 6050 mark_compactor_events_.push_back(anchor_event);
5991 spent_in_mutator_(0), 6051 }
5992 steps_count_(0), 6052
5993 steps_took_(0.0), 6053
5994 longest_step_(0.0), 6054 void GCTracer::Start(GarbageCollector collector,
5995 steps_count_since_last_gc_(0), 6055 const char* gc_reason,
5996 steps_took_since_last_gc_(0.0), 6056 const char* collector_reason) {
5997 heap_(heap), 6057 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return;
5998 gc_reason_(NULL), 6058
5999 collector_reason_(NULL) { 6059 if (collector == SCAVENGER)
Hannes Payer (out of office) 2014/07/22 15:21:30 coding style: if/else likes curly braces
ernstm 2014/07/22 15:57:24 Done.
6060 pending_ = Event(Event::SCAVENGER, gc_reason, collector_reason);
6061 else
6062 pending_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason);
6063
6064 pending_.start_time = base::OS::TimeCurrentMillis();
6065 pending_.start_object_size = heap_->SizeOfObjects();
6066 pending_.start_memory_size = heap_->isolate()->memory_allocator()->Size();
6067 pending_.start_holes_size = CountTotalHolesSize(heap_);
6068
6069 pending_.incremental_marking_steps = incremental_marking_steps_;
6070 pending_.incremental_marking_duration = incremental_marking_duration_;
6071 pending_.longest_incremental_marking_step = longest_incremental_marking_step_;
6072
6000 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { 6073 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) {
6001 scopes_[i] = 0; 6074 pending_.scopes[i] = 0;
6002 } 6075 }
6003 } 6076 }
6004 6077
6005 6078
6006 void GCTracer::start(GarbageCollector collector, 6079 void GCTracer::Stop() {
6007 const char* gc_reason,
6008 const char* collector_reason) {
6009 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return; 6080 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return;
6010 6081
6011 collector_ = collector; 6082 pending_.end_time = base::OS::TimeCurrentMillis();
6012 gc_reason_ = gc_reason; 6083 pending_.end_object_size = heap_->SizeOfObjects();
6013 collector_reason_ = collector_reason; 6084 pending_.end_memory_size = heap_->isolate()->memory_allocator()->Size();
6085 pending_.end_holes_size = CountTotalHolesSize(heap_);
6014 6086
6015 start_time_ = base::OS::TimeCurrentMillis(); 6087 if (pending_.type == Event::SCAVENGER)
6016 start_object_size_ = heap_->SizeOfObjects(); 6088 scavenger_events_.push_back(pending_);
Hannes Payer (out of office) 2014/07/22 15:21:30 coding style: if/else likes curly braces
ernstm 2014/07/22 15:57:24 Done.
6017 start_memory_size_ = heap_->isolate()->memory_allocator()->Size(); 6089 else
6090 mark_compactor_events_.push_back(pending_);
6018 6091
6019 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { 6092 if (pending_.type == Event::MARK_COMPACTOR)
6020 scopes_[i] = 0; 6093 longest_incremental_marking_step_ = 0.0;
6021 }
6022 6094
6023 in_free_list_or_wasted_before_gc_ = CountTotalHolesSize(heap_); 6095 double duration = pending_.end_time - pending_.start_time;
6096 double spent_in_mutator =
6097 Max(pending_.start_time - Previous()->end_time, 0.0);
6024 6098
6025 allocated_since_last_gc_ = 6099 heap_->UpdateCumulativeGCStatistics(duration,
6026 heap_->SizeOfObjects() - heap_->alive_after_last_gc_; 6100 spent_in_mutator,
6101 Current()->scopes[Scope::MC_MARK]);
6027 6102
6028 spent_in_mutator_ = Max(start_time_ - heap_->last_gc_end_timestamp_, 0.0); 6103 if (Current()->type == Event::SCAVENGER && FLAG_trace_gc_ignore_scavenger)
6029 6104 return;
6030 steps_count_ = heap_->incremental_marking()->steps_count();
6031 steps_took_ = heap_->incremental_marking()->steps_took();
6032 longest_step_ = heap_->incremental_marking()->longest_step();
6033 steps_count_since_last_gc_ =
6034 heap_->incremental_marking()->steps_count_since_last_gc();
6035 steps_took_since_last_gc_ =
6036 heap_->incremental_marking()->steps_took_since_last_gc();
6037 }
6038
6039
6040 void GCTracer::stop() {
6041 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return;
6042
6043 end_time_ = base::OS::TimeCurrentMillis();
6044 end_object_size_ = heap_->SizeOfObjects();
6045 end_memory_size_ = heap_->isolate()->memory_allocator()->Size();
6046
6047 heap_->UpdateGCStatistics(start_time_,
6048 end_time_,
6049 spent_in_mutator_,
6050 scopes_[Scope::MC_MARK]);
6051
6052 if (collector_ == SCAVENGER && FLAG_trace_gc_ignore_scavenger) return;
6053 6105
6054 if (FLAG_trace_gc) { 6106 if (FLAG_trace_gc) {
6055 if (FLAG_trace_gc_nvp) 6107 if (FLAG_trace_gc_nvp)
6056 PrintNVP(); 6108 PrintNVP();
6057 else 6109 else
6058 Print(); 6110 Print();
6059 6111
6060 heap_->PrintShortHeapStatistics(); 6112 heap_->PrintShortHeapStatistics();
6061 } 6113 }
6062 } 6114 }
6063 6115
6064 6116
6117 void GCTracer::AddIncrementalMarkingStep(double duration) {
6118 incremental_marking_steps_++;
6119 incremental_marking_duration_ += duration;
6120 longest_incremental_marking_step_ =
6121 Max(longest_incremental_marking_step_, duration);
6122 }
6123
6124
6125 GCTracer::EventBuffer::const_iterator GCTracer::Current() const {
6126 ASSERT(!scavenger_events_.empty() &&
6127 !mark_compactor_events_.empty());
6128
6129 if (scavenger_events_.back()->end_time >=
6130 mark_compactor_events_.back()->end_time)
Hannes Payer (out of office) 2014/07/22 15:21:30 coding style: if/else likes curly braces
ernstm 2014/07/22 15:57:24 Done.
6131 return scavenger_events_.back();
6132 else
6133 return mark_compactor_events_.back();
6134 }
6135
6136
6137 GCTracer::EventBuffer::const_iterator GCTracer::Previous() const {
6138 EventBuffer::const_iterator current = this->Current();
6139
6140 const EventBuffer& current_buffer = (current->type == Event::SCAVENGER) ?
6141 mark_compactor_events_ : scavenger_events_;
6142
6143 const EventBuffer& other_buffer = (current->type == Event::SCAVENGER) ?
6144 mark_compactor_events_ : scavenger_events_;
6145
6146 EventBuffer::const_iterator last_in_other_buffer =
6147 other_buffer.back();
6148
6149 // If we only have one event of the curren type, return the last event of the
6150 // other type.
6151 if (current == current_buffer.begin())
6152 return last_in_other_buffer;
6153
6154 EventBuffer::const_iterator previous_in_current_buffer = current;
6155 --previous_in_current_buffer;
6156
6157 // If there is a more recent event in the other event buffer, return that one.
6158 if (last_in_other_buffer->end_time > previous_in_current_buffer->end_time)
6159 return last_in_other_buffer;
Hannes Payer (out of office) 2014/07/22 15:21:30 coding style: if/else likes curly braces
ernstm 2014/07/22 15:57:24 Done.
6160 else
6161 return previous_in_current_buffer;
6162 }
6163
6164
6065 void GCTracer::Print() const { 6165 void GCTracer::Print() const {
6166 EventBuffer::const_iterator current = Current();
6167 EventBuffer::const_iterator previous = Previous();
6168
6066 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); 6169 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init());
6067 6170
6068 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", 6171 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ",
6069 CollectorString(), 6172 current->TypeName(false),
6070 static_cast<double>(start_object_size_) / MB, 6173 static_cast<double>(current->start_object_size) / MB,
6071 static_cast<double>(start_memory_size_) / MB, 6174 static_cast<double>(current->start_memory_size) / MB,
6072 static_cast<double>(end_object_size_) / MB, 6175 static_cast<double>(current->end_object_size) / MB,
6073 static_cast<double>(end_memory_size_) / MB); 6176 static_cast<double>(current->end_memory_size) / MB);
6074 6177
6075 int external_time = static_cast<int>(scopes_[Scope::EXTERNAL]); 6178 int external_time = static_cast<int>(current->scopes[Scope::EXTERNAL]);
6076 if (external_time > 0) PrintF("%d / ", external_time); 6179 if (external_time > 0) PrintF("%d / ", external_time);
6077 6180
6078 PrintF("%.1f ms", end_time_ - start_time_); 6181 double duration = current->end_time - current->start_time;
6079 if (steps_count_ > 0) { 6182 PrintF("%.1f ms", duration);
6080 if (collector_ == SCAVENGER) { 6183 if (current->type == Event::SCAVENGER) {
6184 int steps = current->incremental_marking_steps -
6185 previous->incremental_marking_steps;
6186 if (steps > 0) {
6081 PrintF(" (+ %.1f ms in %d steps since last GC)", 6187 PrintF(" (+ %.1f ms in %d steps since last GC)",
6082 steps_took_since_last_gc_, 6188 current->incremental_marking_duration -
6083 steps_count_since_last_gc_); 6189 previous->incremental_marking_duration,
6084 } else { 6190 steps);
6191 }
6192 } else {
6193 EventBuffer::const_iterator previous_mark_compactor = current;
6194 --previous_mark_compactor;
6195 int steps = current->incremental_marking_steps -
6196 previous_mark_compactor->incremental_marking_steps;
6197 if (steps > 0) {
6085 PrintF(" (+ %.1f ms in %d steps since start of marking, " 6198 PrintF(" (+ %.1f ms in %d steps since start of marking, "
6086 "biggest step %.1f ms)", 6199 "biggest step %.1f ms)",
6087 steps_took_, 6200 current->incremental_marking_duration -
6088 steps_count_, 6201 previous_mark_compactor->incremental_marking_duration,
6089 longest_step_); 6202 steps,
6203 current->longest_incremental_marking_step);
6090 } 6204 }
6091 } 6205 }
6092 6206
6093 if (gc_reason_ != NULL) { 6207 if (current->gc_reason != NULL) {
6094 PrintF(" [%s]", gc_reason_); 6208 PrintF(" [%s]", current->gc_reason);
6095 } 6209 }
6096 6210
6097 if (collector_reason_ != NULL) { 6211 if (current->collector_reason != NULL) {
6098 PrintF(" [%s]", collector_reason_); 6212 PrintF(" [%s]", current->collector_reason);
6099 } 6213 }
6100 6214
6101 PrintF(".\n"); 6215 PrintF(".\n");
6102 } 6216 }
6103 6217
6104 6218
6105 void GCTracer::PrintNVP() const { 6219 void GCTracer::PrintNVP() const {
6220 EventBuffer::const_iterator current = Current();
6221 EventBuffer::const_iterator previous = Previous();
6222
6106 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); 6223 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init());
6107 6224
6108 PrintF("pause=%.1f ", end_time_ - start_time_); 6225 double duration = current->end_time - current->start_time;
6109 PrintF("mutator=%.1f ", spent_in_mutator_); 6226 double spent_in_mutator = current->start_time - previous->end_time;
6110 PrintF("gc=");
6111 switch (collector_) {
6112 case SCAVENGER:
6113 PrintF("s");
6114 break;
6115 case MARK_COMPACTOR:
6116 PrintF("ms");
6117 break;
6118 default:
6119 UNREACHABLE();
6120 }
6121 PrintF(" ");
6122 6227
6123 PrintF("external=%.1f ", scopes_[Scope::EXTERNAL]); 6228 PrintF("pause=%.1f ", duration);
6124 PrintF("mark=%.1f ", scopes_[Scope::MC_MARK]); 6229 PrintF("mutator=%.1f ", spent_in_mutator);
6125 PrintF("sweep=%.2f ", scopes_[Scope::MC_SWEEP]); 6230 PrintF("gc=%s ", current->TypeName(true));
6126 PrintF("sweepns=%.2f ", scopes_[Scope::MC_SWEEP_NEWSPACE]); 6231
6127 PrintF("sweepos=%.2f ", scopes_[Scope::MC_SWEEP_OLDSPACE]); 6232 PrintF("external=%.1f ", current->scopes[Scope::EXTERNAL]);
6128 PrintF("sweepcode=%.2f ", scopes_[Scope::MC_SWEEP_CODE]); 6233 PrintF("mark=%.1f ", current->scopes[Scope::MC_MARK]);
6129 PrintF("sweepcell=%.2f ", scopes_[Scope::MC_SWEEP_CELL]); 6234 PrintF("sweep=%.2f ", current->scopes[Scope::MC_SWEEP]);
6130 PrintF("sweepmap=%.2f ", scopes_[Scope::MC_SWEEP_MAP]); 6235 PrintF("sweepns=%.2f ", current->scopes[Scope::MC_SWEEP_NEWSPACE]);
6131 PrintF("evacuate=%.1f ", scopes_[Scope::MC_EVACUATE_PAGES]); 6236 PrintF("sweepos=%.2f ", current->scopes[Scope::MC_SWEEP_OLDSPACE]);
6132 PrintF("new_new=%.1f ", scopes_[Scope::MC_UPDATE_NEW_TO_NEW_POINTERS]); 6237 PrintF("sweepcode=%.2f ", current->scopes[Scope::MC_SWEEP_CODE]);
6133 PrintF("root_new=%.1f ", scopes_[Scope::MC_UPDATE_ROOT_TO_NEW_POINTERS]); 6238 PrintF("sweepcell=%.2f ", current->scopes[Scope::MC_SWEEP_CELL]);
6134 PrintF("old_new=%.1f ", scopes_[Scope::MC_UPDATE_OLD_TO_NEW_POINTERS]); 6239 PrintF("sweepmap=%.2f ", current->scopes[Scope::MC_SWEEP_MAP]);
6240 PrintF("evacuate=%.1f ", current->scopes[Scope::MC_EVACUATE_PAGES]);
6241 PrintF("new_new=%.1f ",
6242 current->scopes[Scope::MC_UPDATE_NEW_TO_NEW_POINTERS]);
6243 PrintF("root_new=%.1f ",
6244 current->scopes[Scope::MC_UPDATE_ROOT_TO_NEW_POINTERS]);
6245 PrintF("old_new=%.1f ",
6246 current->scopes[Scope::MC_UPDATE_OLD_TO_NEW_POINTERS]);
6135 PrintF("compaction_ptrs=%.1f ", 6247 PrintF("compaction_ptrs=%.1f ",
6136 scopes_[Scope::MC_UPDATE_POINTERS_TO_EVACUATED]); 6248 current->scopes[Scope::MC_UPDATE_POINTERS_TO_EVACUATED]);
6137 PrintF("intracompaction_ptrs=%.1f ", 6249 PrintF("intracompaction_ptrs=%.1f ",
6138 scopes_[Scope::MC_UPDATE_POINTERS_BETWEEN_EVACUATED]); 6250 current->scopes[Scope::MC_UPDATE_POINTERS_BETWEEN_EVACUATED]);
6139 PrintF("misc_compaction=%.1f ", scopes_[Scope::MC_UPDATE_MISC_POINTERS]); 6251 PrintF("misc_compaction=%.1f ",
6252 current->scopes[Scope::MC_UPDATE_MISC_POINTERS]);
6140 PrintF("weakcollection_process=%.1f ", 6253 PrintF("weakcollection_process=%.1f ",
6141 scopes_[Scope::MC_WEAKCOLLECTION_PROCESS]); 6254 current->scopes[Scope::MC_WEAKCOLLECTION_PROCESS]);
6142 PrintF("weakcollection_clear=%.1f ", 6255 PrintF("weakcollection_clear=%.1f ",
6143 scopes_[Scope::MC_WEAKCOLLECTION_CLEAR]); 6256 current->scopes[Scope::MC_WEAKCOLLECTION_CLEAR]);
6144 6257
6145 PrintF("total_size_before=%" V8_PTR_PREFIX "d ", start_object_size_); 6258 PrintF("total_size_before=%" V8_PTR_PREFIX "d ", current->start_object_size);
6146 PrintF("total_size_after=%" V8_PTR_PREFIX "d ", end_object_size_); 6259 PrintF("total_size_after=%" V8_PTR_PREFIX "d ", current->end_object_size);
6147 PrintF("holes_size_before=%" V8_PTR_PREFIX "d ", 6260 PrintF("holes_size_before=%" V8_PTR_PREFIX "d ", current->start_holes_size);
6148 in_free_list_or_wasted_before_gc_); 6261 PrintF("holes_size_after=%" V8_PTR_PREFIX "d ", current->end_holes_size);
6149 PrintF("holes_size_after=%" V8_PTR_PREFIX "d ", CountTotalHolesSize(heap_));
6150 6262
6151 PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc_); 6263 intptr_t allocated_since_last_gc =
6264 current->start_object_size - previous->end_object_size;
6265 PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc);
6152 PrintF("promoted=%" V8_PTR_PREFIX "d ", heap_->promoted_objects_size_); 6266 PrintF("promoted=%" V8_PTR_PREFIX "d ", heap_->promoted_objects_size_);
6153 PrintF("semi_space_copied=%" V8_PTR_PREFIX "d ", 6267 PrintF("semi_space_copied=%" V8_PTR_PREFIX "d ",
6154 heap_->semi_space_copied_object_size_); 6268 heap_->semi_space_copied_object_size_);
6155 PrintF("nodes_died_in_new=%d ", heap_->nodes_died_in_new_space_); 6269 PrintF("nodes_died_in_new=%d ", heap_->nodes_died_in_new_space_);
6156 PrintF("nodes_copied_in_new=%d ", heap_->nodes_copied_in_new_space_); 6270 PrintF("nodes_copied_in_new=%d ", heap_->nodes_copied_in_new_space_);
6157 PrintF("nodes_promoted=%d ", heap_->nodes_promoted_); 6271 PrintF("nodes_promoted=%d ", heap_->nodes_promoted_);
6158 PrintF("promotion_rate=%.1f%% ", heap_->promotion_rate_); 6272 PrintF("promotion_rate=%.1f%% ", heap_->promotion_rate_);
6159 PrintF("semi_space_copy_rate=%.1f%% ", heap_->semi_space_copied_rate_); 6273 PrintF("semi_space_copy_rate=%.1f%% ", heap_->semi_space_copied_rate_);
6160 6274
6161 if (collector_ == SCAVENGER) { 6275 if (current->type == Event::SCAVENGER) {
6162 PrintF("stepscount=%d ", steps_count_since_last_gc_); 6276 PrintF("stepscount=%d ", current->incremental_marking_steps -
6163 PrintF("stepstook=%.1f ", steps_took_since_last_gc_); 6277 previous->incremental_marking_steps);
6278 PrintF("stepstook=%.1f ", current->incremental_marking_duration -
6279 previous->incremental_marking_duration);
6164 } else { 6280 } else {
6165 PrintF("stepscount=%d ", steps_count_); 6281 EventBuffer::const_iterator previous_mark_compactor = current;
6166 PrintF("stepstook=%.1f ", steps_took_); 6282 --previous_mark_compactor;
6167 PrintF("longeststep=%.1f ", longest_step_); 6283 PrintF("stepscount=%d ", current->incremental_marking_steps -
6284 previous_mark_compactor->incremental_marking_steps);
6285 PrintF("stepstook=%.1f ", current->incremental_marking_duration -
6286 previous_mark_compactor->incremental_marking_duration);
6287 PrintF("longeststep=%.1f ", current->longest_incremental_marking_step);
6168 } 6288 }
6169 6289
6170 PrintF("\n"); 6290 PrintF("\n");
6171 } 6291 }
6172 6292
6173 6293
6174 const char* GCTracer::CollectorString() const {
6175 switch (collector_) {
6176 case SCAVENGER:
6177 return "Scavenge";
6178 case MARK_COMPACTOR:
6179 return "Mark-sweep";
6180 }
6181 return "Unknown GC";
6182 }
6183
6184
6185 int KeyedLookupCache::Hash(Handle<Map> map, Handle<Name> name) { 6294 int KeyedLookupCache::Hash(Handle<Map> map, Handle<Name> name) {
6186 DisallowHeapAllocation no_gc; 6295 DisallowHeapAllocation no_gc;
6187 // Uses only lower 32 bits if pointers are larger. 6296 // Uses only lower 32 bits if pointers are larger.
6188 uintptr_t addr_hash = 6297 uintptr_t addr_hash =
6189 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(*map)) >> kMapHashShift; 6298 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(*map)) >> kMapHashShift;
6190 return static_cast<uint32_t>((addr_hash ^ name->Hash()) & kCapacityMask); 6299 return static_cast<uint32_t>((addr_hash ^ name->Hash()) & kCapacityMask);
6191 } 6300 }
6192 6301
6193 6302
6194 int KeyedLookupCache::Lookup(Handle<Map> map, Handle<Name> name) { 6303 int KeyedLookupCache::Lookup(Handle<Map> map, Handle<Name> name) {
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
6441 static_cast<int>(object_sizes_last_time_[index])); 6550 static_cast<int>(object_sizes_last_time_[index]));
6442 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6551 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6443 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6552 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6444 6553
6445 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6554 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6446 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6555 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6447 ClearObjectStats(); 6556 ClearObjectStats();
6448 } 6557 }
6449 6558
6450 } } // namespace v8::internal 6559 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698