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

Side by Side Diff: src/heap/heap.cc

Issue 1154873003: Add old generation allocation throughput computation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix CE Created 5 years, 6 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
« no previous file with comments | « src/heap/heap.h ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 last_idle_notification_time_(0.0), 135 last_idle_notification_time_(0.0),
136 last_gc_time_(0.0), 136 last_gc_time_(0.0),
137 mark_compact_collector_(this), 137 mark_compact_collector_(this),
138 store_buffer_(this), 138 store_buffer_(this),
139 marking_(this), 139 marking_(this),
140 incremental_marking_(this), 140 incremental_marking_(this),
141 gc_count_at_last_idle_gc_(0), 141 gc_count_at_last_idle_gc_(0),
142 full_codegen_bytes_generated_(0), 142 full_codegen_bytes_generated_(0),
143 crankshaft_codegen_bytes_generated_(0), 143 crankshaft_codegen_bytes_generated_(0),
144 new_space_allocation_counter_(0), 144 new_space_allocation_counter_(0),
145 old_generation_allocation_counter_(0),
146 old_generation_size_at_last_gc_(0),
145 gcs_since_last_deopt_(0), 147 gcs_since_last_deopt_(0),
146 allocation_sites_scratchpad_length_(0), 148 allocation_sites_scratchpad_length_(0),
147 promotion_queue_(this), 149 promotion_queue_(this),
148 configured_(false), 150 configured_(false),
149 external_string_table_(this), 151 external_string_table_(this),
150 chunks_queued_for_free_(NULL), 152 chunks_queued_for_free_(NULL),
151 gc_callbacks_depth_(0), 153 gc_callbacks_depth_(0),
152 deserialization_complete_(false), 154 deserialization_complete_(false),
153 concurrent_sweeping_enabled_(false), 155 concurrent_sweeping_enabled_(false),
154 strong_roots_list_(NULL) { 156 strong_roots_list_(NULL) {
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 isolate()->optimizing_compile_dispatcher()->AgeBufferedOsrJobs(); 462 isolate()->optimizing_compile_dispatcher()->AgeBufferedOsrJobs();
461 } 463 }
462 464
463 if (new_space_.IsAtMaximumCapacity()) { 465 if (new_space_.IsAtMaximumCapacity()) {
464 maximum_size_scavenges_++; 466 maximum_size_scavenges_++;
465 } else { 467 } else {
466 maximum_size_scavenges_ = 0; 468 maximum_size_scavenges_ = 0;
467 } 469 }
468 CheckNewSpaceExpansionCriteria(); 470 CheckNewSpaceExpansionCriteria();
469 UpdateNewSpaceAllocationCounter(); 471 UpdateNewSpaceAllocationCounter();
472 UpdateOldGenerationAllocationCounter();
470 } 473 }
471 474
472 475
473 intptr_t Heap::SizeOfObjects() { 476 intptr_t Heap::SizeOfObjects() {
474 intptr_t total = 0; 477 intptr_t total = 0;
475 AllSpaces spaces(this); 478 AllSpaces spaces(this);
476 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { 479 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) {
477 total += space->SizeOfObjects(); 480 total += space->SizeOfObjects();
478 } 481 }
479 return total; 482 return total;
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 #ifdef DEBUG 731 #ifdef DEBUG
729 ReportStatisticsAfterGC(); 732 ReportStatisticsAfterGC();
730 #endif // DEBUG 733 #endif // DEBUG
731 734
732 // Remember the last top pointer so that we can later find out 735 // Remember the last top pointer so that we can later find out
733 // whether we allocated in new space since the last GC. 736 // whether we allocated in new space since the last GC.
734 new_space_top_after_last_gc_ = new_space()->top(); 737 new_space_top_after_last_gc_ = new_space()->top();
735 last_gc_time_ = MonotonicallyIncreasingTimeInMs(); 738 last_gc_time_ = MonotonicallyIncreasingTimeInMs();
736 739
737 ReduceNewSpaceSize( 740 ReduceNewSpaceSize(
738 tracer()->CurrentNewSpaceAllocationThroughputInBytesPerMillisecond()); 741 tracer()->CurrentAllocationThroughputInBytesPerMillisecond());
739 } 742 }
740 743
741 744
742 void Heap::PreprocessStackTraces() { 745 void Heap::PreprocessStackTraces() {
743 if (!weak_stack_trace_list()->IsWeakFixedArray()) return; 746 if (!weak_stack_trace_list()->IsWeakFixedArray()) return;
744 WeakFixedArray* array = WeakFixedArray::cast(weak_stack_trace_list()); 747 WeakFixedArray* array = WeakFixedArray::cast(weak_stack_trace_list());
745 int length = array->Length(); 748 int length = array->Length();
746 for (int i = 0; i < length; i++) { 749 for (int i = 0; i < length; i++) {
747 if (array->IsEmptySlot(i)) continue; 750 if (array->IsEmptySlot(i)) continue;
748 FixedArray* elements = FixedArray::cast(array->Get(i)); 751 FixedArray* elements = FixedArray::cast(array->Get(i));
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 // Temporarily set the limit for case when PostGarbageCollectionProcessing 1219 // Temporarily set the limit for case when PostGarbageCollectionProcessing
1217 // allocates and triggers GC. The real limit is set at after 1220 // allocates and triggers GC. The real limit is set at after
1218 // PostGarbageCollectionProcessing. 1221 // PostGarbageCollectionProcessing.
1219 SetOldGenerationAllocationLimit(PromotedSpaceSizeOfObjects(), 0); 1222 SetOldGenerationAllocationLimit(PromotedSpaceSizeOfObjects(), 0);
1220 old_gen_exhausted_ = false; 1223 old_gen_exhausted_ = false;
1221 old_generation_size_configured_ = true; 1224 old_generation_size_configured_ = true;
1222 } else { 1225 } else {
1223 Scavenge(); 1226 Scavenge();
1224 } 1227 }
1225 1228
1229 // This should be updated before PostGarbageCollectionProcessing, which can
1230 // cause another GC.
1231 old_generation_size_at_last_gc_ = PromotedSpaceSizeOfObjects();
1232
1226 UpdateSurvivalStatistics(start_new_space_size); 1233 UpdateSurvivalStatistics(start_new_space_size);
1227 ConfigureInitialOldGenerationSize(); 1234 ConfigureInitialOldGenerationSize();
1228 1235
1229 isolate_->counters()->objs_since_last_young()->Set(0); 1236 isolate_->counters()->objs_since_last_young()->Set(0);
1230 1237
1231 // Callbacks that fire after this point might trigger nested GCs and 1238 // Callbacks that fire after this point might trigger nested GCs and
1232 // restart incremental marking, the assertion can't be moved down. 1239 // restart incremental marking, the assertion can't be moved down.
1233 DCHECK(collector == SCAVENGER || incremental_marking()->IsStopped()); 1240 DCHECK(collector == SCAVENGER || incremental_marking()->IsStopped());
1234 1241
1235 gc_post_processing_depth_++; 1242 gc_post_processing_depth_++;
(...skipping 3383 matching lines...) Expand 10 before | Expand all | Expand 10 after
4619 tracer()->IncrementalMarkingSpeedInBytesPerMillisecond()); 4626 tracer()->IncrementalMarkingSpeedInBytesPerMillisecond());
4620 heap_state.final_incremental_mark_compact_speed_in_bytes_per_ms = 4627 heap_state.final_incremental_mark_compact_speed_in_bytes_per_ms =
4621 static_cast<size_t>( 4628 static_cast<size_t>(
4622 tracer()->FinalIncrementalMarkCompactSpeedInBytesPerMillisecond()); 4629 tracer()->FinalIncrementalMarkCompactSpeedInBytesPerMillisecond());
4623 heap_state.scavenge_speed_in_bytes_per_ms = 4630 heap_state.scavenge_speed_in_bytes_per_ms =
4624 static_cast<size_t>(tracer()->ScavengeSpeedInBytesPerMillisecond()); 4631 static_cast<size_t>(tracer()->ScavengeSpeedInBytesPerMillisecond());
4625 heap_state.used_new_space_size = new_space_.Size(); 4632 heap_state.used_new_space_size = new_space_.Size();
4626 heap_state.new_space_capacity = new_space_.Capacity(); 4633 heap_state.new_space_capacity = new_space_.Capacity();
4627 heap_state.new_space_allocation_throughput_in_bytes_per_ms = 4634 heap_state.new_space_allocation_throughput_in_bytes_per_ms =
4628 tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond(); 4635 tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond();
4629 heap_state.current_new_space_allocation_throughput_in_bytes_per_ms = 4636 heap_state.current_allocation_throughput_in_bytes_per_ms =
4630 tracer()->CurrentNewSpaceAllocationThroughputInBytesPerMillisecond(); 4637 tracer()->CurrentAllocationThroughputInBytesPerMillisecond();
4631 intptr_t limit = old_generation_allocation_limit_; 4638 intptr_t limit = old_generation_allocation_limit_;
4632 if (HasLowAllocationRate( 4639 if (HasLowAllocationRate(
4633 heap_state.current_new_space_allocation_throughput_in_bytes_per_ms)) { 4640 heap_state.current_allocation_throughput_in_bytes_per_ms)) {
4634 limit = idle_old_generation_allocation_limit_; 4641 limit = idle_old_generation_allocation_limit_;
4635 } 4642 }
4636 heap_state.can_start_incremental_marking = 4643 heap_state.can_start_incremental_marking =
4637 incremental_marking()->CanBeActivated() && 4644 incremental_marking()->CanBeActivated() &&
4638 HeapIsFullEnoughToStartIncrementalMarking(limit) && 4645 HeapIsFullEnoughToStartIncrementalMarking(limit) &&
4639 !mark_compact_collector()->sweeping_in_progress(); 4646 !mark_compact_collector()->sweeping_in_progress();
4640 return heap_state; 4647 return heap_state;
4641 } 4648 }
4642 4649
4643 4650
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
4777 static_cast<double>(base::Time::kMillisecondsPerSecond); 4784 static_cast<double>(base::Time::kMillisecondsPerSecond);
4778 HistogramTimerScope idle_notification_scope( 4785 HistogramTimerScope idle_notification_scope(
4779 isolate_->counters()->gc_idle_notification()); 4786 isolate_->counters()->gc_idle_notification());
4780 double start_ms = MonotonicallyIncreasingTimeInMs(); 4787 double start_ms = MonotonicallyIncreasingTimeInMs();
4781 double idle_time_in_ms = deadline_in_ms - start_ms; 4788 double idle_time_in_ms = deadline_in_ms - start_ms;
4782 bool is_long_idle_notification = 4789 bool is_long_idle_notification =
4783 static_cast<size_t>(idle_time_in_ms) > 4790 static_cast<size_t>(idle_time_in_ms) >
4784 GCIdleTimeHandler::kMaxFrameRenderingIdleTime; 4791 GCIdleTimeHandler::kMaxFrameRenderingIdleTime;
4785 4792
4786 if (is_long_idle_notification) { 4793 if (is_long_idle_notification) {
4787 tracer()->SampleNewSpaceAllocation(start_ms, NewSpaceAllocationCounter()); 4794 tracer()->SampleAllocation(start_ms, NewSpaceAllocationCounter(),
4795 OldGenerationAllocationCounter());
4788 } 4796 }
4789 4797
4790 GCIdleTimeHandler::HeapState heap_state = ComputeHeapState(); 4798 GCIdleTimeHandler::HeapState heap_state = ComputeHeapState();
4791 4799
4792 GCIdleTimeAction action = 4800 GCIdleTimeAction action =
4793 gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state); 4801 gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state);
4794 4802
4795 bool result = PerformIdleTimeAction(action, heap_state, deadline_in_ms, 4803 bool result = PerformIdleTimeAction(action, heap_state, deadline_in_ms,
4796 is_long_idle_notification); 4804 is_long_idle_notification);
4797 4805
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after
6586 *object_type = "CODE_TYPE"; \ 6594 *object_type = "CODE_TYPE"; \
6587 *object_sub_type = "CODE_AGE/" #name; \ 6595 *object_sub_type = "CODE_AGE/" #name; \
6588 return true; 6596 return true;
6589 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6597 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6590 #undef COMPARE_AND_RETURN_NAME 6598 #undef COMPARE_AND_RETURN_NAME
6591 } 6599 }
6592 return false; 6600 return false;
6593 } 6601 }
6594 } 6602 }
6595 } // namespace v8::internal 6603 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698