| 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/ast/context-slot-cache.h" | 9 #include "src/ast/context-slot-cache.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 kGCCallbackFlagSynchronousPhantomCallbackProcessing); | 916 kGCCallbackFlagSynchronousPhantomCallbackProcessing); |
| 917 } | 917 } |
| 918 } else { | 918 } else { |
| 919 // Incremental marking is turned on an has already been started. | 919 // Incremental marking is turned on an has already been started. |
| 920 | 920 |
| 921 // TODO(mlippautz): Compute the time slice for incremental marking based on | 921 // TODO(mlippautz): Compute the time slice for incremental marking based on |
| 922 // memory pressure. | 922 // memory pressure. |
| 923 double deadline = MonotonicallyIncreasingTimeInMs() + | 923 double deadline = MonotonicallyIncreasingTimeInMs() + |
| 924 FLAG_external_allocation_limit_incremental_time; | 924 FLAG_external_allocation_limit_incremental_time; |
| 925 incremental_marking()->AdvanceIncrementalMarking( | 925 incremental_marking()->AdvanceIncrementalMarking( |
| 926 deadline, | 926 deadline, IncrementalMarking::GC_VIA_STACK_GUARD, |
| 927 IncrementalMarking::StepActions(IncrementalMarking::GC_VIA_STACK_GUARD, | 927 IncrementalMarking::FORCE_COMPLETION); |
| 928 IncrementalMarking::FORCE_MARKING, | |
| 929 IncrementalMarking::FORCE_COMPLETION)); | |
| 930 } | 928 } |
| 931 } | 929 } |
| 932 | 930 |
| 933 | 931 |
| 934 void Heap::EnsureFillerObjectAtTop() { | 932 void Heap::EnsureFillerObjectAtTop() { |
| 935 // There may be an allocation memento behind objects in new space. Upon | 933 // There may be an allocation memento behind objects in new space. Upon |
| 936 // evacuation of a non-full new space (or if we are on the last page) there | 934 // evacuation of a non-full new space (or if we are on the last page) there |
| 937 // may be uninitialized memory behind top. We fill the remainder of the page | 935 // may be uninitialized memory behind top. We fill the remainder of the page |
| 938 // with a filler. | 936 // with a filler. |
| 939 Address to_top = new_space_.top(); | 937 Address to_top = new_space_.top(); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 } | 1034 } |
| 1037 | 1035 |
| 1038 if (collector == MARK_COMPACTOR && | 1036 if (collector == MARK_COMPACTOR && |
| 1039 (gc_callback_flags & (kGCCallbackFlagForced | | 1037 (gc_callback_flags & (kGCCallbackFlagForced | |
| 1040 kGCCallbackFlagCollectAllAvailableGarbage)) != 0) { | 1038 kGCCallbackFlagCollectAllAvailableGarbage)) != 0) { |
| 1041 isolate()->CountUsage(v8::Isolate::kForcedGC); | 1039 isolate()->CountUsage(v8::Isolate::kForcedGC); |
| 1042 } | 1040 } |
| 1043 | 1041 |
| 1044 // Start incremental marking for the next cycle. The heap snapshot | 1042 // Start incremental marking for the next cycle. The heap snapshot |
| 1045 // generator needs incremental marking to stay off after it aborted. | 1043 // generator needs incremental marking to stay off after it aborted. |
| 1046 if (!ShouldAbortIncrementalMarking() && incremental_marking()->IsStopped() && | 1044 if (!ShouldAbortIncrementalMarking()) { |
| 1047 incremental_marking()->ShouldActivateEvenWithoutIdleNotification()) { | 1045 StartIncrementalMarkingIfNeeded(kNoGCFlags, kNoGCCallbackFlags, |
| 1048 StartIncrementalMarking(kNoGCFlags, kNoGCCallbackFlags, "GC epilogue"); | 1046 "GC epilogue"); |
| 1049 } | 1047 } |
| 1050 | 1048 |
| 1051 return next_gc_likely_to_collect_more; | 1049 return next_gc_likely_to_collect_more; |
| 1052 } | 1050 } |
| 1053 | 1051 |
| 1054 | 1052 |
| 1055 int Heap::NotifyContextDisposed(bool dependant_context) { | 1053 int Heap::NotifyContextDisposed(bool dependant_context) { |
| 1056 if (!dependant_context) { | 1054 if (!dependant_context) { |
| 1057 tracer()->ResetSurvivalEvents(); | 1055 tracer()->ResetSurvivalEvents(); |
| 1058 old_generation_size_configured_ = false; | 1056 old_generation_size_configured_ = false; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1074 | 1072 |
| 1075 void Heap::StartIncrementalMarking(int gc_flags, | 1073 void Heap::StartIncrementalMarking(int gc_flags, |
| 1076 const GCCallbackFlags gc_callback_flags, | 1074 const GCCallbackFlags gc_callback_flags, |
| 1077 const char* reason) { | 1075 const char* reason) { |
| 1078 DCHECK(incremental_marking()->IsStopped()); | 1076 DCHECK(incremental_marking()->IsStopped()); |
| 1079 set_current_gc_flags(gc_flags); | 1077 set_current_gc_flags(gc_flags); |
| 1080 current_gc_callback_flags_ = gc_callback_flags; | 1078 current_gc_callback_flags_ = gc_callback_flags; |
| 1081 incremental_marking()->Start(reason); | 1079 incremental_marking()->Start(reason); |
| 1082 } | 1080 } |
| 1083 | 1081 |
| 1082 void Heap::StartIncrementalMarkingIfNeeded( |
| 1083 int gc_flags, const GCCallbackFlags gc_callback_flags, const char* reason) { |
| 1084 if (incremental_marking()->IsStopped() && |
| 1085 incremental_marking()->ShouldActivateEvenWithoutIdleNotification()) { |
| 1086 StartIncrementalMarking(gc_flags, gc_callback_flags, reason); |
| 1087 } |
| 1088 } |
| 1084 | 1089 |
| 1085 void Heap::StartIdleIncrementalMarking() { | 1090 void Heap::StartIdleIncrementalMarking() { |
| 1086 gc_idle_time_handler_->ResetNoProgressCounter(); | 1091 gc_idle_time_handler_->ResetNoProgressCounter(); |
| 1087 StartIncrementalMarking(kReduceMemoryFootprintMask, kNoGCCallbackFlags, | 1092 StartIncrementalMarking(kReduceMemoryFootprintMask, kNoGCCallbackFlags, |
| 1088 "idle"); | 1093 "idle"); |
| 1089 } | 1094 } |
| 1090 | 1095 |
| 1091 | 1096 |
| 1092 void Heap::MoveElements(FixedArray* array, int dst_index, int src_index, | 1097 void Heap::MoveElements(FixedArray* array, int dst_index, int src_index, |
| 1093 int len) { | 1098 int len) { |
| (...skipping 5416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6510 } | 6515 } |
| 6511 | 6516 |
| 6512 | 6517 |
| 6513 // static | 6518 // static |
| 6514 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6519 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6515 return StaticVisitorBase::GetVisitorId(map); | 6520 return StaticVisitorBase::GetVisitorId(map); |
| 6516 } | 6521 } |
| 6517 | 6522 |
| 6518 } // namespace internal | 6523 } // namespace internal |
| 6519 } // namespace v8 | 6524 } // namespace v8 |
| OLD | NEW |