| 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 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 const int kMinNumberOfAttempts = 2; | 761 const int kMinNumberOfAttempts = 2; |
| 762 for (int attempt = 0; attempt < kMaxNumberOfAttempts; attempt++) { | 762 for (int attempt = 0; attempt < kMaxNumberOfAttempts; attempt++) { |
| 763 if (!CollectGarbage(MARK_COMPACTOR, gc_reason, NULL) && | 763 if (!CollectGarbage(MARK_COMPACTOR, gc_reason, NULL) && |
| 764 attempt + 1 >= kMinNumberOfAttempts) { | 764 attempt + 1 >= kMinNumberOfAttempts) { |
| 765 break; | 765 break; |
| 766 } | 766 } |
| 767 } | 767 } |
| 768 mark_compact_collector()->SetFlags(kNoGCFlags); | 768 mark_compact_collector()->SetFlags(kNoGCFlags); |
| 769 new_space_.Shrink(); | 769 new_space_.Shrink(); |
| 770 UncommitFromSpace(); | 770 UncommitFromSpace(); |
| 771 incremental_marking()->UncommitMarkingDeque(); | |
| 772 } | 771 } |
| 773 | 772 |
| 774 | 773 |
| 775 void Heap::EnsureFillerObjectAtTop() { | 774 void Heap::EnsureFillerObjectAtTop() { |
| 776 // There may be an allocation memento behind every object in new space. | 775 // There may be an allocation memento behind every object in new space. |
| 777 // If we evacuate a not full new space or if we are on the last page of | 776 // If we evacuate a not full new space or if we are on the last page of |
| 778 // the new space, then there may be uninitialized memory behind the top | 777 // the new space, then there may be uninitialized memory behind the top |
| 779 // pointer of the new space page. We store a filler object there to | 778 // pointer of the new space page. We store a filler object there to |
| 780 // identify the unused space. | 779 // identify the unused space. |
| 781 Address from_top = new_space_.top(); | 780 Address from_top = new_space_.top(); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 | 1125 |
| 1127 // Update relocatables. | 1126 // Update relocatables. |
| 1128 Relocatable::PostGarbageCollectionProcessing(isolate_); | 1127 Relocatable::PostGarbageCollectionProcessing(isolate_); |
| 1129 | 1128 |
| 1130 if (collector == MARK_COMPACTOR) { | 1129 if (collector == MARK_COMPACTOR) { |
| 1131 // Register the amount of external allocated memory. | 1130 // Register the amount of external allocated memory. |
| 1132 amount_of_external_allocated_memory_at_last_global_gc_ = | 1131 amount_of_external_allocated_memory_at_last_global_gc_ = |
| 1133 amount_of_external_allocated_memory_; | 1132 amount_of_external_allocated_memory_; |
| 1134 old_generation_allocation_limit_ = OldGenerationAllocationLimit( | 1133 old_generation_allocation_limit_ = OldGenerationAllocationLimit( |
| 1135 PromotedSpaceSizeOfObjects(), freed_global_handles); | 1134 PromotedSpaceSizeOfObjects(), freed_global_handles); |
| 1135 // We finished a marking cycle. We can uncommit the marking deque until |
| 1136 // we start marking again. |
| 1137 mark_compact_collector_.UncommitMarkingDeque(); |
| 1136 } | 1138 } |
| 1137 | 1139 |
| 1138 { | 1140 { |
| 1139 GCCallbacksScope scope(this); | 1141 GCCallbacksScope scope(this); |
| 1140 if (scope.CheckReenter()) { | 1142 if (scope.CheckReenter()) { |
| 1141 AllowHeapAllocation allow_allocation; | 1143 AllowHeapAllocation allow_allocation; |
| 1142 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); | 1144 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); |
| 1143 VMState<EXTERNAL> state(isolate_); | 1145 VMState<EXTERNAL> state(isolate_); |
| 1144 HandleScope handle_scope(isolate_); | 1146 HandleScope handle_scope(isolate_); |
| 1145 CallGCEpilogueCallbacks(gc_type, gc_callback_flags); | 1147 CallGCEpilogueCallbacks(gc_type, gc_callback_flags); |
| (...skipping 3236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4382 new_space_.Shrink(); | 4384 new_space_.Shrink(); |
| 4383 UncommitFromSpace(); | 4385 UncommitFromSpace(); |
| 4384 } | 4386 } |
| 4385 } | 4387 } |
| 4386 | 4388 |
| 4387 | 4389 |
| 4388 void Heap::TryFinalizeIdleIncrementalMarking( | 4390 void Heap::TryFinalizeIdleIncrementalMarking( |
| 4389 double idle_time_in_ms, size_t size_of_objects, | 4391 double idle_time_in_ms, size_t size_of_objects, |
| 4390 size_t final_incremental_mark_compact_speed_in_bytes_per_ms) { | 4392 size_t final_incremental_mark_compact_speed_in_bytes_per_ms) { |
| 4391 if (incremental_marking()->IsComplete() || | 4393 if (incremental_marking()->IsComplete() || |
| 4392 (incremental_marking()->IsMarkingDequeEmpty() && | 4394 (mark_compact_collector_.marking_deque()->IsEmpty() && |
| 4393 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( | 4395 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( |
| 4394 static_cast<size_t>(idle_time_in_ms), size_of_objects, | 4396 static_cast<size_t>(idle_time_in_ms), size_of_objects, |
| 4395 final_incremental_mark_compact_speed_in_bytes_per_ms))) { | 4397 final_incremental_mark_compact_speed_in_bytes_per_ms))) { |
| 4396 CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); | 4398 CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); |
| 4397 } | 4399 } |
| 4398 } | 4400 } |
| 4399 | 4401 |
| 4400 | 4402 |
| 4401 bool Heap::WorthActivatingIncrementalMarking() { | 4403 bool Heap::WorthActivatingIncrementalMarking() { |
| 4402 return incremental_marking()->IsStopped() && | 4404 return incremental_marking()->IsStopped() && |
| (...skipping 1076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5479 property_cell_space_ = NULL; | 5481 property_cell_space_ = NULL; |
| 5480 } | 5482 } |
| 5481 | 5483 |
| 5482 if (lo_space_ != NULL) { | 5484 if (lo_space_ != NULL) { |
| 5483 lo_space_->TearDown(); | 5485 lo_space_->TearDown(); |
| 5484 delete lo_space_; | 5486 delete lo_space_; |
| 5485 lo_space_ = NULL; | 5487 lo_space_ = NULL; |
| 5486 } | 5488 } |
| 5487 | 5489 |
| 5488 store_buffer()->TearDown(); | 5490 store_buffer()->TearDown(); |
| 5489 incremental_marking()->TearDown(); | |
| 5490 | 5491 |
| 5491 isolate_->memory_allocator()->TearDown(); | 5492 isolate_->memory_allocator()->TearDown(); |
| 5492 } | 5493 } |
| 5493 | 5494 |
| 5494 | 5495 |
| 5495 void Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, | 5496 void Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, |
| 5496 GCType gc_type, bool pass_isolate) { | 5497 GCType gc_type, bool pass_isolate) { |
| 5497 DCHECK(callback != NULL); | 5498 DCHECK(callback != NULL); |
| 5498 GCPrologueCallbackPair pair(callback, gc_type, pass_isolate); | 5499 GCPrologueCallbackPair pair(callback, gc_type, pass_isolate); |
| 5499 DCHECK(!gc_prologue_callbacks_.Contains(pair)); | 5500 DCHECK(!gc_prologue_callbacks_.Contains(pair)); |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6347 static_cast<int>(object_sizes_last_time_[index])); | 6348 static_cast<int>(object_sizes_last_time_[index])); |
| 6348 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6349 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 6349 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6350 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 6350 | 6351 |
| 6351 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6352 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 6352 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6353 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 6353 ClearObjectStats(); | 6354 ClearObjectStats(); |
| 6354 } | 6355 } |
| 6355 } | 6356 } |
| 6356 } // namespace v8::internal | 6357 } // namespace v8::internal |
| OLD | NEW |