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 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 } | 733 } |
734 // We must not compact the weak fixed list here, as we may be in the middle | 734 // We must not compact the weak fixed list here, as we may be in the middle |
735 // of writing to it, when the GC triggered. Instead, we reset the root value. | 735 // of writing to it, when the GC triggered. Instead, we reset the root value. |
736 set_weak_stack_trace_list(Smi::FromInt(0)); | 736 set_weak_stack_trace_list(Smi::FromInt(0)); |
737 } | 737 } |
738 | 738 |
739 | 739 |
740 void Heap::HandleGCRequest() { | 740 void Heap::HandleGCRequest() { |
741 if (incremental_marking()->request_type() == | 741 if (incremental_marking()->request_type() == |
742 IncrementalMarking::COMPLETE_MARKING) { | 742 IncrementalMarking::COMPLETE_MARKING) { |
743 CollectAllGarbage(Heap::kNoGCFlags, "GC interrupt", | 743 CollectAllGarbage(current_gc_flags(), "GC interrupt", |
744 incremental_marking()->CallbackFlags()); | 744 incremental_marking()->CallbackFlags()); |
745 return; | 745 return; |
746 } | 746 } |
747 DCHECK(FLAG_overapproximate_weak_closure); | 747 DCHECK(FLAG_overapproximate_weak_closure); |
748 if (!incremental_marking()->weak_closure_was_overapproximated()) { | 748 if (!incremental_marking()->weak_closure_was_overapproximated()) { |
749 OverApproximateWeakClosure("GC interrupt"); | 749 OverApproximateWeakClosure("GC interrupt"); |
750 } | 750 } |
751 } | 751 } |
752 | 752 |
753 | 753 |
(...skipping 3987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4741 // Fragmentation is high if committed > 2 * used + kSlack. | 4741 // Fragmentation is high if committed > 2 * used + kSlack. |
4742 // Rewrite the exression to avoid overflow. | 4742 // Rewrite the exression to avoid overflow. |
4743 return committed - used > used + kSlack; | 4743 return committed - used > used + kSlack; |
4744 } | 4744 } |
4745 | 4745 |
4746 | 4746 |
4747 void Heap::ReduceNewSpaceSize() { | 4747 void Heap::ReduceNewSpaceSize() { |
4748 // TODO(ulan): Unify this constant with the similar constant in | 4748 // TODO(ulan): Unify this constant with the similar constant in |
4749 // GCIdleTimeHandler once the change is merged to 4.5. | 4749 // GCIdleTimeHandler once the change is merged to 4.5. |
4750 static const size_t kLowAllocationThroughput = 1000; | 4750 static const size_t kLowAllocationThroughput = 1000; |
4751 size_t allocation_throughput = | 4751 const size_t allocation_throughput = |
4752 tracer()->CurrentAllocationThroughputInBytesPerMillisecond(); | 4752 tracer()->CurrentAllocationThroughputInBytesPerMillisecond(); |
4753 if (FLAG_predictable || allocation_throughput == 0) return; | 4753 |
4754 if (allocation_throughput < kLowAllocationThroughput) { | 4754 if (FLAG_predictable) return; |
| 4755 |
| 4756 if (ShouldReduceMemory() || |
| 4757 ((allocation_throughput != 0) && |
| 4758 (allocation_throughput < kLowAllocationThroughput))) { |
4755 new_space_.Shrink(); | 4759 new_space_.Shrink(); |
4756 UncommitFromSpace(); | 4760 UncommitFromSpace(); |
4757 } | 4761 } |
4758 } | 4762 } |
4759 | 4763 |
4760 | 4764 |
4761 void Heap::FinalizeIncrementalMarkingIfComplete(const char* comment) { | 4765 void Heap::FinalizeIncrementalMarkingIfComplete(const char* comment) { |
4762 if (FLAG_overapproximate_weak_closure && | 4766 if (FLAG_overapproximate_weak_closure && |
4763 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || | 4767 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || |
4764 (!incremental_marking()->weak_closure_was_overapproximated() && | 4768 (!incremental_marking()->weak_closure_was_overapproximated() && |
4765 mark_compact_collector_.marking_deque()->IsEmpty()))) { | 4769 mark_compact_collector_.marking_deque()->IsEmpty()))) { |
4766 OverApproximateWeakClosure(comment); | 4770 OverApproximateWeakClosure(comment); |
4767 } else if (incremental_marking()->IsComplete() || | 4771 } else if (incremental_marking()->IsComplete() || |
4768 (mark_compact_collector_.marking_deque()->IsEmpty())) { | 4772 (mark_compact_collector_.marking_deque()->IsEmpty())) { |
4769 CollectAllGarbage(kNoGCFlags, comment); | 4773 CollectAllGarbage(current_gc_flags(), comment); |
4770 } | 4774 } |
4771 } | 4775 } |
4772 | 4776 |
4773 | 4777 |
4774 bool Heap::TryFinalizeIdleIncrementalMarking( | 4778 bool Heap::TryFinalizeIdleIncrementalMarking( |
4775 double idle_time_in_ms, size_t size_of_objects, | 4779 double idle_time_in_ms, size_t size_of_objects, |
4776 size_t final_incremental_mark_compact_speed_in_bytes_per_ms) { | 4780 size_t final_incremental_mark_compact_speed_in_bytes_per_ms) { |
4777 if (FLAG_overapproximate_weak_closure && | 4781 if (FLAG_overapproximate_weak_closure && |
4778 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || | 4782 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || |
4779 (!incremental_marking()->weak_closure_was_overapproximated() && | 4783 (!incremental_marking()->weak_closure_was_overapproximated() && |
4780 mark_compact_collector_.marking_deque()->IsEmpty() && | 4784 mark_compact_collector_.marking_deque()->IsEmpty() && |
4781 gc_idle_time_handler_.ShouldDoOverApproximateWeakClosure( | 4785 gc_idle_time_handler_.ShouldDoOverApproximateWeakClosure( |
4782 static_cast<size_t>(idle_time_in_ms))))) { | 4786 static_cast<size_t>(idle_time_in_ms))))) { |
4783 OverApproximateWeakClosure( | 4787 OverApproximateWeakClosure( |
4784 "Idle notification: overapproximate weak closure"); | 4788 "Idle notification: overapproximate weak closure"); |
4785 return true; | 4789 return true; |
4786 } else if (incremental_marking()->IsComplete() || | 4790 } else if (incremental_marking()->IsComplete() || |
4787 (mark_compact_collector_.marking_deque()->IsEmpty() && | 4791 (mark_compact_collector_.marking_deque()->IsEmpty() && |
4788 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( | 4792 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( |
4789 static_cast<size_t>(idle_time_in_ms), size_of_objects, | 4793 static_cast<size_t>(idle_time_in_ms), size_of_objects, |
4790 final_incremental_mark_compact_speed_in_bytes_per_ms))) { | 4794 final_incremental_mark_compact_speed_in_bytes_per_ms))) { |
4791 CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); | 4795 CollectAllGarbage(current_gc_flags(), |
| 4796 "idle notification: finalize incremental"); |
4792 return true; | 4797 return true; |
4793 } | 4798 } |
4794 return false; | 4799 return false; |
4795 } | 4800 } |
4796 | 4801 |
4797 | 4802 |
4798 GCIdleTimeHandler::HeapState Heap::ComputeHeapState() { | 4803 GCIdleTimeHandler::HeapState Heap::ComputeHeapState() { |
4799 GCIdleTimeHandler::HeapState heap_state; | 4804 GCIdleTimeHandler::HeapState heap_state; |
4800 heap_state.contexts_disposed = contexts_disposed_; | 4805 heap_state.contexts_disposed = contexts_disposed_; |
4801 heap_state.contexts_disposal_rate = | 4806 heap_state.contexts_disposal_rate = |
(...skipping 2070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6872 *object_type = "CODE_TYPE"; \ | 6877 *object_type = "CODE_TYPE"; \ |
6873 *object_sub_type = "CODE_AGE/" #name; \ | 6878 *object_sub_type = "CODE_AGE/" #name; \ |
6874 return true; | 6879 return true; |
6875 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6880 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
6876 #undef COMPARE_AND_RETURN_NAME | 6881 #undef COMPARE_AND_RETURN_NAME |
6877 } | 6882 } |
6878 return false; | 6883 return false; |
6879 } | 6884 } |
6880 } // namespace internal | 6885 } // namespace internal |
6881 } // namespace v8 | 6886 } // namespace v8 |
OLD | NEW |