| 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 max_executable_size_(256ul * (kPointerSize / 4) * MB), | 88 max_executable_size_(256ul * (kPointerSize / 4) * MB), |
| 89 // Variables set based on semispace_size_ and old_generation_size_ in | 89 // Variables set based on semispace_size_ and old_generation_size_ in |
| 90 // ConfigureHeap. | 90 // ConfigureHeap. |
| 91 // Will be 4 * reserved_semispace_size_ to ensure that young | 91 // Will be 4 * reserved_semispace_size_ to ensure that young |
| 92 // generation can be aligned to its size. | 92 // generation can be aligned to its size. |
| 93 maximum_committed_(0), | 93 maximum_committed_(0), |
| 94 survived_since_last_expansion_(0), | 94 survived_since_last_expansion_(0), |
| 95 survived_last_scavenge_(0), | 95 survived_last_scavenge_(0), |
| 96 always_allocate_scope_count_(0), | 96 always_allocate_scope_count_(0), |
| 97 memory_pressure_level_(MemoryPressureLevel::kNone), | 97 memory_pressure_level_(MemoryPressureLevel::kNone), |
| 98 out_of_memory_callback_(nullptr), |
| 99 out_of_memory_callback_data_(nullptr), |
| 98 contexts_disposed_(0), | 100 contexts_disposed_(0), |
| 99 number_of_disposed_maps_(0), | 101 number_of_disposed_maps_(0), |
| 100 global_ic_age_(0), | 102 global_ic_age_(0), |
| 101 new_space_(nullptr), | 103 new_space_(nullptr), |
| 102 old_space_(NULL), | 104 old_space_(NULL), |
| 103 code_space_(NULL), | 105 code_space_(NULL), |
| 104 map_space_(NULL), | 106 map_space_(NULL), |
| 105 lo_space_(NULL), | 107 lo_space_(NULL), |
| 106 gc_state_(NOT_IN_GC), | 108 gc_state_(NOT_IN_GC), |
| 107 gc_post_processing_depth_(0), | 109 gc_post_processing_depth_(0), |
| (...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 // not matter, so long as we do not specify NEW_SPACE, which would not | 862 // not matter, so long as we do not specify NEW_SPACE, which would not |
| 861 // cause a full GC. | 863 // cause a full GC. |
| 862 // Major GC would invoke weak handle callbacks on weakly reachable | 864 // Major GC would invoke weak handle callbacks on weakly reachable |
| 863 // handles, but won't collect weakly reachable objects until next | 865 // handles, but won't collect weakly reachable objects until next |
| 864 // major GC. Therefore if we collect aggressively and weak handle callback | 866 // major GC. Therefore if we collect aggressively and weak handle callback |
| 865 // has been invoked, we rerun major GC to release objects which become | 867 // has been invoked, we rerun major GC to release objects which become |
| 866 // garbage. | 868 // garbage. |
| 867 // Note: as weak callbacks can execute arbitrary code, we cannot | 869 // Note: as weak callbacks can execute arbitrary code, we cannot |
| 868 // hope that eventually there will be no weak callbacks invocations. | 870 // hope that eventually there will be no weak callbacks invocations. |
| 869 // Therefore stop recollecting after several attempts. | 871 // Therefore stop recollecting after several attempts. |
| 872 if (gc_reason == GarbageCollectionReason::kLastResort) { |
| 873 InvokeOutOfMemoryCallback(); |
| 874 } |
| 870 RuntimeCallTimerScope(isolate(), &RuntimeCallStats::GC_AllAvailableGarbage); | 875 RuntimeCallTimerScope(isolate(), &RuntimeCallStats::GC_AllAvailableGarbage); |
| 871 if (isolate()->concurrent_recompilation_enabled()) { | 876 if (isolate()->concurrent_recompilation_enabled()) { |
| 872 // The optimizing compiler may be unnecessarily holding on to memory. | 877 // The optimizing compiler may be unnecessarily holding on to memory. |
| 873 DisallowHeapAllocation no_recursive_gc; | 878 DisallowHeapAllocation no_recursive_gc; |
| 874 isolate()->optimizing_compile_dispatcher()->Flush(); | 879 isolate()->optimizing_compile_dispatcher()->Flush(); |
| 875 } | 880 } |
| 876 isolate()->ClearSerializerData(); | 881 isolate()->ClearSerializerData(); |
| 877 set_current_gc_flags(kMakeHeapIterableMask | kReduceMemoryFootprintMask); | 882 set_current_gc_flags(kMakeHeapIterableMask | kReduceMemoryFootprintMask); |
| 878 isolate_->compilation_cache()->Clear(); | 883 isolate_->compilation_cache()->Clear(); |
| 879 const int kMaxNumberOfAttempts = 7; | 884 const int kMaxNumberOfAttempts = 7; |
| (...skipping 3647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4527 } else { | 4532 } else { |
| 4528 ExecutionAccess access(isolate()); | 4533 ExecutionAccess access(isolate()); |
| 4529 isolate()->stack_guard()->RequestGC(); | 4534 isolate()->stack_guard()->RequestGC(); |
| 4530 V8::GetCurrentPlatform()->CallOnForegroundThread( | 4535 V8::GetCurrentPlatform()->CallOnForegroundThread( |
| 4531 reinterpret_cast<v8::Isolate*>(isolate()), | 4536 reinterpret_cast<v8::Isolate*>(isolate()), |
| 4532 new MemoryPressureInterruptTask(this)); | 4537 new MemoryPressureInterruptTask(this)); |
| 4533 } | 4538 } |
| 4534 } | 4539 } |
| 4535 } | 4540 } |
| 4536 | 4541 |
| 4542 void Heap::SetOutOfMemoryCallback(v8::debug::OutOfMemoryCallback callback, |
| 4543 void* data) { |
| 4544 out_of_memory_callback_ = callback; |
| 4545 out_of_memory_callback_data_ = data; |
| 4546 } |
| 4547 |
| 4548 void Heap::InvokeOutOfMemoryCallback() { |
| 4549 if (out_of_memory_callback_) { |
| 4550 out_of_memory_callback_(out_of_memory_callback_data_); |
| 4551 } |
| 4552 } |
| 4553 |
| 4537 void Heap::CollectCodeStatistics() { | 4554 void Heap::CollectCodeStatistics() { |
| 4538 CodeStatistics::ResetCodeAndMetadataStatistics(isolate()); | 4555 CodeStatistics::ResetCodeAndMetadataStatistics(isolate()); |
| 4539 // We do not look for code in new space, or map space. If code | 4556 // We do not look for code in new space, or map space. If code |
| 4540 // somehow ends up in those spaces, we would miss it here. | 4557 // somehow ends up in those spaces, we would miss it here. |
| 4541 CodeStatistics::CollectCodeStatistics(code_space_, isolate()); | 4558 CodeStatistics::CollectCodeStatistics(code_space_, isolate()); |
| 4542 CodeStatistics::CollectCodeStatistics(old_space_, isolate()); | 4559 CodeStatistics::CollectCodeStatistics(old_space_, isolate()); |
| 4543 CodeStatistics::CollectCodeStatistics(lo_space_, isolate()); | 4560 CodeStatistics::CollectCodeStatistics(lo_space_, isolate()); |
| 4544 } | 4561 } |
| 4545 | 4562 |
| 4546 #ifdef DEBUG | 4563 #ifdef DEBUG |
| (...skipping 1998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6545 } | 6562 } |
| 6546 | 6563 |
| 6547 | 6564 |
| 6548 // static | 6565 // static |
| 6549 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6566 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6550 return StaticVisitorBase::GetVisitorId(map); | 6567 return StaticVisitorBase::GetVisitorId(map); |
| 6551 } | 6568 } |
| 6552 | 6569 |
| 6553 } // namespace internal | 6570 } // namespace internal |
| 6554 } // namespace v8 | 6571 } // namespace v8 |
| OLD | NEW |