OLD | NEW |
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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 nodes_copied_in_new_space_(0), | 126 nodes_copied_in_new_space_(0), |
127 nodes_promoted_(0), | 127 nodes_promoted_(0), |
128 maximum_size_scavenges_(0), | 128 maximum_size_scavenges_(0), |
129 max_gc_pause_(0.0), | 129 max_gc_pause_(0.0), |
130 total_gc_time_ms_(0.0), | 130 total_gc_time_ms_(0.0), |
131 max_alive_after_gc_(0), | 131 max_alive_after_gc_(0), |
132 min_in_mutator_(kMaxInt), | 132 min_in_mutator_(kMaxInt), |
133 marking_time_(0.0), | 133 marking_time_(0.0), |
134 sweeping_time_(0.0), | 134 sweeping_time_(0.0), |
135 last_idle_notification_time_(0.0), | 135 last_idle_notification_time_(0.0), |
| 136 last_gc_time_(0.0), |
136 mark_compact_collector_(this), | 137 mark_compact_collector_(this), |
137 store_buffer_(this), | 138 store_buffer_(this), |
138 marking_(this), | 139 marking_(this), |
139 incremental_marking_(this), | 140 incremental_marking_(this), |
140 gc_count_at_last_idle_gc_(0), | 141 gc_count_at_last_idle_gc_(0), |
141 full_codegen_bytes_generated_(0), | 142 full_codegen_bytes_generated_(0), |
142 crankshaft_codegen_bytes_generated_(0), | 143 crankshaft_codegen_bytes_generated_(0), |
143 gcs_since_last_deopt_(0), | 144 gcs_since_last_deopt_(0), |
144 allocation_sites_scratchpad_length_(0), | 145 allocation_sites_scratchpad_length_(0), |
145 promotion_queue_(this), | 146 promotion_queue_(this), |
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 #undef UPDATE_FRAGMENTATION_FOR_SPACE | 719 #undef UPDATE_FRAGMENTATION_FOR_SPACE |
719 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE | 720 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE |
720 | 721 |
721 #ifdef DEBUG | 722 #ifdef DEBUG |
722 ReportStatisticsAfterGC(); | 723 ReportStatisticsAfterGC(); |
723 #endif // DEBUG | 724 #endif // DEBUG |
724 | 725 |
725 // Remember the last top pointer so that we can later find out | 726 // Remember the last top pointer so that we can later find out |
726 // whether we allocated in new space since the last GC. | 727 // whether we allocated in new space since the last GC. |
727 new_space_top_after_last_gc_ = new_space()->top(); | 728 new_space_top_after_last_gc_ = new_space()->top(); |
| 729 last_gc_time_ = MonotonicallyIncreasingTimeInMs(); |
728 } | 730 } |
729 | 731 |
730 | 732 |
731 void Heap::PreprocessStackTraces() { | 733 void Heap::PreprocessStackTraces() { |
732 if (!weak_stack_trace_list()->IsWeakFixedArray()) return; | 734 if (!weak_stack_trace_list()->IsWeakFixedArray()) return; |
733 WeakFixedArray* array = WeakFixedArray::cast(weak_stack_trace_list()); | 735 WeakFixedArray* array = WeakFixedArray::cast(weak_stack_trace_list()); |
734 int length = array->Length(); | 736 int length = array->Length(); |
735 for (int i = 0; i < length; i++) { | 737 for (int i = 0; i < length; i++) { |
736 if (array->IsEmptySlot(i)) continue; | 738 if (array->IsEmptySlot(i)) continue; |
737 FixedArray* elements = FixedArray::cast(array->Get(i)); | 739 FixedArray* elements = FixedArray::cast(array->Get(i)); |
(...skipping 3867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4605 deadline_in_seconds * | 4607 deadline_in_seconds * |
4606 static_cast<double>(base::Time::kMillisecondsPerSecond); | 4608 static_cast<double>(base::Time::kMillisecondsPerSecond); |
4607 HistogramTimerScope idle_notification_scope( | 4609 HistogramTimerScope idle_notification_scope( |
4608 isolate_->counters()->gc_idle_notification()); | 4610 isolate_->counters()->gc_idle_notification()); |
4609 double start_ms = MonotonicallyIncreasingTimeInMs(); | 4611 double start_ms = MonotonicallyIncreasingTimeInMs(); |
4610 double idle_time_in_ms = deadline_in_ms - start_ms; | 4612 double idle_time_in_ms = deadline_in_ms - start_ms; |
4611 bool is_long_idle_notification = | 4613 bool is_long_idle_notification = |
4612 static_cast<size_t>(idle_time_in_ms) > | 4614 static_cast<size_t>(idle_time_in_ms) > |
4613 GCIdleTimeHandler::kMaxFrameRenderingIdleTime; | 4615 GCIdleTimeHandler::kMaxFrameRenderingIdleTime; |
4614 | 4616 |
| 4617 static const double kLastGCTimeTreshold = 1000; |
| 4618 |
4615 GCIdleTimeHandler::HeapState heap_state; | 4619 GCIdleTimeHandler::HeapState heap_state; |
4616 heap_state.contexts_disposed = contexts_disposed_; | 4620 heap_state.contexts_disposed = contexts_disposed_; |
4617 heap_state.contexts_disposal_rate = | 4621 heap_state.contexts_disposal_rate = |
4618 tracer()->ContextDisposalRateInMilliseconds(); | 4622 tracer()->ContextDisposalRateInMilliseconds(); |
4619 heap_state.size_of_objects = static_cast<size_t>(SizeOfObjects()); | 4623 heap_state.size_of_objects = static_cast<size_t>(SizeOfObjects()); |
4620 heap_state.incremental_marking_stopped = incremental_marking()->IsStopped(); | 4624 heap_state.incremental_marking_stopped = incremental_marking()->IsStopped(); |
4621 // TODO(ulan): Start incremental marking only for large heaps. | 4625 // TODO(ulan): Start incremental marking only for large heaps. |
4622 intptr_t limit = old_generation_allocation_limit_; | 4626 intptr_t limit = old_generation_allocation_limit_; |
4623 if (is_long_idle_notification) { | 4627 if (is_long_idle_notification && |
| 4628 (start_ms - last_gc_time_ > kLastGCTimeTreshold)) { |
4624 limit = idle_old_generation_allocation_limit_; | 4629 limit = idle_old_generation_allocation_limit_; |
4625 } | 4630 } |
4626 | 4631 |
4627 heap_state.can_start_incremental_marking = | 4632 heap_state.can_start_incremental_marking = |
4628 incremental_marking()->CanBeActivated() && | 4633 incremental_marking()->CanBeActivated() && |
4629 HeapIsFullEnoughToStartIncrementalMarking(limit) && | 4634 HeapIsFullEnoughToStartIncrementalMarking(limit) && |
4630 !mark_compact_collector()->sweeping_in_progress(); | 4635 !mark_compact_collector()->sweeping_in_progress(); |
4631 heap_state.sweeping_in_progress = | 4636 heap_state.sweeping_in_progress = |
4632 mark_compact_collector()->sweeping_in_progress(); | 4637 mark_compact_collector()->sweeping_in_progress(); |
4633 heap_state.sweeping_completed = | 4638 heap_state.sweeping_completed = |
(...skipping 1907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6541 *object_type = "CODE_TYPE"; \ | 6546 *object_type = "CODE_TYPE"; \ |
6542 *object_sub_type = "CODE_AGE/" #name; \ | 6547 *object_sub_type = "CODE_AGE/" #name; \ |
6543 return true; | 6548 return true; |
6544 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6549 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
6545 #undef COMPARE_AND_RETURN_NAME | 6550 #undef COMPARE_AND_RETURN_NAME |
6546 } | 6551 } |
6547 return false; | 6552 return false; |
6548 } | 6553 } |
6549 } | 6554 } |
6550 } // namespace v8::internal | 6555 } // namespace v8::internal |
OLD | NEW |