| 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/heap/heap.h" | 5 #include "src/heap/heap.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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 marking_time_(0.0), | 116 marking_time_(0.0), |
| 117 sweeping_time_(0.0), | 117 sweeping_time_(0.0), |
| 118 last_idle_notification_time_(0.0), | 118 last_idle_notification_time_(0.0), |
| 119 last_gc_time_(0.0), | 119 last_gc_time_(0.0), |
| 120 mark_compact_collector_(this), | 120 mark_compact_collector_(this), |
| 121 store_buffer_(this), | 121 store_buffer_(this), |
| 122 incremental_marking_(this), | 122 incremental_marking_(this), |
| 123 memory_reducer_(this), | 123 memory_reducer_(nullptr), |
| 124 full_codegen_bytes_generated_(0), | 124 full_codegen_bytes_generated_(0), |
| 125 crankshaft_codegen_bytes_generated_(0), | 125 crankshaft_codegen_bytes_generated_(0), |
| 126 new_space_allocation_counter_(0), | 126 new_space_allocation_counter_(0), |
| 127 old_generation_allocation_counter_(0), | 127 old_generation_allocation_counter_(0), |
| 128 old_generation_size_at_last_gc_(0), | 128 old_generation_size_at_last_gc_(0), |
| 129 gcs_since_last_deopt_(0), | 129 gcs_since_last_deopt_(0), |
| 130 allocation_sites_scratchpad_length_(0), | 130 allocation_sites_scratchpad_length_(0), |
| 131 ring_buffer_full_(false), | 131 ring_buffer_full_(false), |
| 132 ring_buffer_end_(0), | 132 ring_buffer_end_(0), |
| 133 promotion_queue_(this), | 133 promotion_queue_(this), |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 event.time_ms = MonotonicallyIncreasingTimeInMs(); | 932 event.time_ms = MonotonicallyIncreasingTimeInMs(); |
| 933 // Trigger one more GC if | 933 // Trigger one more GC if |
| 934 // - this GC decreased committed memory, | 934 // - this GC decreased committed memory, |
| 935 // - there is high fragmentation, | 935 // - there is high fragmentation, |
| 936 // - there are live detached contexts. | 936 // - there are live detached contexts. |
| 937 event.next_gc_likely_to_collect_more = | 937 event.next_gc_likely_to_collect_more = |
| 938 (committed_memory_before - committed_memory_after) > MB || | 938 (committed_memory_before - committed_memory_after) > MB || |
| 939 HasHighFragmentation(used_memory_after, committed_memory_after) || | 939 HasHighFragmentation(used_memory_after, committed_memory_after) || |
| 940 (detached_contexts()->length() > 0); | 940 (detached_contexts()->length() > 0); |
| 941 if (deserialization_complete_) { | 941 if (deserialization_complete_) { |
| 942 memory_reducer_.NotifyMarkCompact(event); | 942 memory_reducer_->NotifyMarkCompact(event); |
| 943 } | 943 } |
| 944 } | 944 } |
| 945 | 945 |
| 946 tracer()->Stop(collector); | 946 tracer()->Stop(collector); |
| 947 } | 947 } |
| 948 | 948 |
| 949 if (collector == MARK_COMPACTOR && | 949 if (collector == MARK_COMPACTOR && |
| 950 (gc_callback_flags & kGCCallbackFlagForced) != 0) { | 950 (gc_callback_flags & kGCCallbackFlagForced) != 0) { |
| 951 isolate()->CountUsage(v8::Isolate::kForcedGC); | 951 isolate()->CountUsage(v8::Isolate::kForcedGC); |
| 952 } | 952 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 971 if (isolate()->concurrent_recompilation_enabled()) { | 971 if (isolate()->concurrent_recompilation_enabled()) { |
| 972 // Flush the queued recompilation tasks. | 972 // Flush the queued recompilation tasks. |
| 973 isolate()->optimizing_compile_dispatcher()->Flush(); | 973 isolate()->optimizing_compile_dispatcher()->Flush(); |
| 974 } | 974 } |
| 975 AgeInlineCaches(); | 975 AgeInlineCaches(); |
| 976 set_retained_maps(ArrayList::cast(empty_fixed_array())); | 976 set_retained_maps(ArrayList::cast(empty_fixed_array())); |
| 977 tracer()->AddContextDisposalTime(base::OS::TimeCurrentMillis()); | 977 tracer()->AddContextDisposalTime(base::OS::TimeCurrentMillis()); |
| 978 MemoryReducer::Event event; | 978 MemoryReducer::Event event; |
| 979 event.type = MemoryReducer::kContextDisposed; | 979 event.type = MemoryReducer::kContextDisposed; |
| 980 event.time_ms = MonotonicallyIncreasingTimeInMs(); | 980 event.time_ms = MonotonicallyIncreasingTimeInMs(); |
| 981 memory_reducer_.NotifyContextDisposed(event); | 981 memory_reducer_->NotifyContextDisposed(event); |
| 982 return ++contexts_disposed_; | 982 return ++contexts_disposed_; |
| 983 } | 983 } |
| 984 | 984 |
| 985 | 985 |
| 986 void Heap::StartIncrementalMarking(int gc_flags, | 986 void Heap::StartIncrementalMarking(int gc_flags, |
| 987 const GCCallbackFlags gc_callback_flags, | 987 const GCCallbackFlags gc_callback_flags, |
| 988 const char* reason) { | 988 const char* reason) { |
| 989 DCHECK(incremental_marking()->IsStopped()); | 989 DCHECK(incremental_marking()->IsStopped()); |
| 990 incremental_marking()->Start(gc_flags, gc_callback_flags, reason); | 990 incremental_marking()->Start(gc_flags, gc_callback_flags, reason); |
| 991 } | 991 } |
| (...skipping 3969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4961 | 4961 |
| 4962 | 4962 |
| 4963 void Heap::CheckAndNotifyBackgroundIdleNotification(double idle_time_in_ms, | 4963 void Heap::CheckAndNotifyBackgroundIdleNotification(double idle_time_in_ms, |
| 4964 double now_ms) { | 4964 double now_ms) { |
| 4965 if (idle_time_in_ms >= GCIdleTimeHandler::kMinBackgroundIdleTime) { | 4965 if (idle_time_in_ms >= GCIdleTimeHandler::kMinBackgroundIdleTime) { |
| 4966 MemoryReducer::Event event; | 4966 MemoryReducer::Event event; |
| 4967 event.type = MemoryReducer::kBackgroundIdleNotification; | 4967 event.type = MemoryReducer::kBackgroundIdleNotification; |
| 4968 event.time_ms = now_ms; | 4968 event.time_ms = now_ms; |
| 4969 event.can_start_incremental_gc = incremental_marking()->IsStopped() && | 4969 event.can_start_incremental_gc = incremental_marking()->IsStopped() && |
| 4970 incremental_marking()->CanBeActivated(); | 4970 incremental_marking()->CanBeActivated(); |
| 4971 memory_reducer_.NotifyBackgroundIdleNotification(event); | 4971 memory_reducer_->NotifyBackgroundIdleNotification(event); |
| 4972 optimize_for_memory_usage_ = true; | 4972 optimize_for_memory_usage_ = true; |
| 4973 } else { | 4973 } else { |
| 4974 optimize_for_memory_usage_ = false; | 4974 optimize_for_memory_usage_ = false; |
| 4975 } | 4975 } |
| 4976 } | 4976 } |
| 4977 | 4977 |
| 4978 | 4978 |
| 4979 double Heap::MonotonicallyIncreasingTimeInMs() { | 4979 double Heap::MonotonicallyIncreasingTimeInMs() { |
| 4980 return V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * | 4980 return V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * |
| 4981 static_cast<double>(base::Time::kMillisecondsPerSecond); | 4981 static_cast<double>(base::Time::kMillisecondsPerSecond); |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5654 gc_speed, mutator_speed); | 5654 gc_speed, mutator_speed); |
| 5655 } | 5655 } |
| 5656 | 5656 |
| 5657 // We set the old generation growing factor to 2 to grow the heap slower on | 5657 // We set the old generation growing factor to 2 to grow the heap slower on |
| 5658 // memory-constrained devices. | 5658 // memory-constrained devices. |
| 5659 if (max_old_generation_size_ <= kMaxOldSpaceSizeMediumMemoryDevice || | 5659 if (max_old_generation_size_ <= kMaxOldSpaceSizeMediumMemoryDevice || |
| 5660 FLAG_optimize_for_size) { | 5660 FLAG_optimize_for_size) { |
| 5661 factor = Min(factor, kMaxHeapGrowingFactorMemoryConstrained); | 5661 factor = Min(factor, kMaxHeapGrowingFactorMemoryConstrained); |
| 5662 } | 5662 } |
| 5663 | 5663 |
| 5664 if (memory_reducer_.ShouldGrowHeapSlowly() || optimize_for_memory_usage_) { | 5664 if (memory_reducer_->ShouldGrowHeapSlowly() || optimize_for_memory_usage_) { |
| 5665 factor = Min(factor, kConservativeHeapGrowingFactor); | 5665 factor = Min(factor, kConservativeHeapGrowingFactor); |
| 5666 } | 5666 } |
| 5667 | 5667 |
| 5668 if (FLAG_stress_compaction || | 5668 if (FLAG_stress_compaction || |
| 5669 mark_compact_collector()->reduce_memory_footprint_) { | 5669 mark_compact_collector()->reduce_memory_footprint_) { |
| 5670 factor = kMinHeapGrowingFactor; | 5670 factor = kMinHeapGrowingFactor; |
| 5671 } | 5671 } |
| 5672 | 5672 |
| 5673 old_generation_allocation_limit_ = | 5673 old_generation_allocation_limit_ = |
| 5674 CalculateOldGenerationAllocationLimit(factor, old_gen_size); | 5674 CalculateOldGenerationAllocationLimit(factor, old_gen_size); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5802 } | 5802 } |
| 5803 } | 5803 } |
| 5804 | 5804 |
| 5805 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount); | 5805 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount); |
| 5806 i++) { | 5806 i++) { |
| 5807 deferred_counters_[i] = 0; | 5807 deferred_counters_[i] = 0; |
| 5808 } | 5808 } |
| 5809 | 5809 |
| 5810 tracer_ = new GCTracer(this); | 5810 tracer_ = new GCTracer(this); |
| 5811 | 5811 |
| 5812 memory_reducer_ = new MemoryReducer(this); |
| 5813 |
| 5812 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); | 5814 LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); |
| 5813 LOG(isolate_, IntPtrTEvent("heap-available", Available())); | 5815 LOG(isolate_, IntPtrTEvent("heap-available", Available())); |
| 5814 | 5816 |
| 5815 store_buffer()->SetUp(); | 5817 store_buffer()->SetUp(); |
| 5816 | 5818 |
| 5817 mark_compact_collector()->SetUp(); | 5819 mark_compact_collector()->SetUp(); |
| 5818 | 5820 |
| 5819 return true; | 5821 return true; |
| 5820 } | 5822 } |
| 5821 | 5823 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5900 map_space_->MaximumCommittedMemory()); | 5902 map_space_->MaximumCommittedMemory()); |
| 5901 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", | 5903 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", |
| 5902 lo_space_->MaximumCommittedMemory()); | 5904 lo_space_->MaximumCommittedMemory()); |
| 5903 PrintF("\n\n"); | 5905 PrintF("\n\n"); |
| 5904 } | 5906 } |
| 5905 | 5907 |
| 5906 if (FLAG_verify_predictable) { | 5908 if (FLAG_verify_predictable) { |
| 5907 PrintAlloctionsHash(); | 5909 PrintAlloctionsHash(); |
| 5908 } | 5910 } |
| 5909 | 5911 |
| 5910 memory_reducer_.TearDown(); | 5912 if (memory_reducer_ != nullptr) { |
| 5913 memory_reducer_->TearDown(); |
| 5914 delete memory_reducer_; |
| 5915 memory_reducer_ = nullptr; |
| 5916 } |
| 5911 | 5917 |
| 5912 TearDownArrayBuffers(); | 5918 TearDownArrayBuffers(); |
| 5913 | 5919 |
| 5914 isolate_->global_handles()->TearDown(); | 5920 isolate_->global_handles()->TearDown(); |
| 5915 | 5921 |
| 5916 external_string_table_.TearDown(); | 5922 external_string_table_.TearDown(); |
| 5917 | 5923 |
| 5918 mark_compact_collector()->TearDown(); | 5924 mark_compact_collector()->TearDown(); |
| 5919 | 5925 |
| 5920 delete tracer_; | 5926 delete tracer_; |
| (...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6909 *object_type = "CODE_TYPE"; \ | 6915 *object_type = "CODE_TYPE"; \ |
| 6910 *object_sub_type = "CODE_AGE/" #name; \ | 6916 *object_sub_type = "CODE_AGE/" #name; \ |
| 6911 return true; | 6917 return true; |
| 6912 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6918 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
| 6913 #undef COMPARE_AND_RETURN_NAME | 6919 #undef COMPARE_AND_RETURN_NAME |
| 6914 } | 6920 } |
| 6915 return false; | 6921 return false; |
| 6916 } | 6922 } |
| 6917 } // namespace internal | 6923 } // namespace internal |
| 6918 } // namespace v8 | 6924 } // namespace v8 |
| OLD | NEW |