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/mark-compact.h" | 5 #include "src/heap/mark-compact.h" |
6 | 6 |
7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 | 36 |
37 // ------------------------------------------------------------------------- | 37 // ------------------------------------------------------------------------- |
38 // MarkCompactCollector | 38 // MarkCompactCollector |
39 | 39 |
40 MarkCompactCollector::MarkCompactCollector(Heap* heap) | 40 MarkCompactCollector::MarkCompactCollector(Heap* heap) |
41 : // NOLINT | 41 : // NOLINT |
42 #ifdef DEBUG | 42 #ifdef DEBUG |
43 state_(IDLE), | 43 state_(IDLE), |
44 #endif | 44 #endif |
45 reduce_memory_footprint_(false), | |
46 abort_incremental_marking_(false), | |
47 finalize_incremental_marking_(false), | |
48 marking_parity_(ODD_MARKING_PARITY), | 45 marking_parity_(ODD_MARKING_PARITY), |
49 compacting_(false), | 46 compacting_(false), |
50 was_marked_incrementally_(false), | 47 was_marked_incrementally_(false), |
51 sweeping_in_progress_(false), | 48 sweeping_in_progress_(false), |
52 pending_sweeper_jobs_semaphore_(0), | 49 pending_sweeper_jobs_semaphore_(0), |
53 evacuation_(false), | 50 evacuation_(false), |
54 migration_slots_buffer_(NULL), | 51 migration_slots_buffer_(NULL), |
55 heap_(heap), | 52 heap_(heap), |
56 marking_deque_memory_(NULL), | 53 marking_deque_memory_(NULL), |
57 marking_deque_memory_committed_(0), | 54 marking_deque_memory_committed_(0), |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 DCHECK(p->area_size() == area_size); | 656 DCHECK(p->area_size() == area_size); |
660 int live_bytes = | 657 int live_bytes = |
661 p->WasSwept() ? p->LiveBytesFromFreeList() : p->LiveBytes(); | 658 p->WasSwept() ? p->LiveBytesFromFreeList() : p->LiveBytes(); |
662 pages.push_back(std::make_pair(live_bytes, p)); | 659 pages.push_back(std::make_pair(live_bytes, p)); |
663 } | 660 } |
664 | 661 |
665 int candidate_count = 0; | 662 int candidate_count = 0; |
666 int total_live_bytes = 0; | 663 int total_live_bytes = 0; |
667 | 664 |
668 bool reduce_memory = | 665 bool reduce_memory = |
669 reduce_memory_footprint_ || heap()->HasLowAllocationRate(); | 666 heap()->ShouldReduceMemory() || heap()->HasLowAllocationRate(); |
670 if (FLAG_manual_evacuation_candidates_selection) { | 667 if (FLAG_manual_evacuation_candidates_selection) { |
671 for (size_t i = 0; i < pages.size(); i++) { | 668 for (size_t i = 0; i < pages.size(); i++) { |
672 Page* p = pages[i].second; | 669 Page* p = pages[i].second; |
673 if (p->IsFlagSet(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING)) { | 670 if (p->IsFlagSet(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING)) { |
674 candidate_count++; | 671 candidate_count++; |
675 total_live_bytes += pages[i].first; | 672 total_live_bytes += pages[i].first; |
676 p->ClearFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 673 p->ClearFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
677 AddEvacuationCandidate(p); | 674 AddEvacuationCandidate(p); |
678 } | 675 } |
679 } | 676 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 #endif | 778 #endif |
782 | 779 |
783 DCHECK(!FLAG_never_compact || !FLAG_always_compact); | 780 DCHECK(!FLAG_never_compact || !FLAG_always_compact); |
784 | 781 |
785 if (sweeping_in_progress()) { | 782 if (sweeping_in_progress()) { |
786 // Instead of waiting we could also abort the sweeper threads here. | 783 // Instead of waiting we could also abort the sweeper threads here. |
787 EnsureSweepingCompleted(); | 784 EnsureSweepingCompleted(); |
788 } | 785 } |
789 | 786 |
790 // Clear marking bits if incremental marking is aborted. | 787 // Clear marking bits if incremental marking is aborted. |
791 if (was_marked_incrementally_ && abort_incremental_marking_) { | 788 if (was_marked_incrementally_ && heap_->ShouldAbortIncrementalMarking()) { |
792 heap()->incremental_marking()->Stop(); | 789 heap()->incremental_marking()->Stop(); |
793 ClearMarkbits(); | 790 ClearMarkbits(); |
794 AbortWeakCollections(); | 791 AbortWeakCollections(); |
795 AbortWeakCells(); | 792 AbortWeakCells(); |
796 AbortCompaction(); | 793 AbortCompaction(); |
797 was_marked_incrementally_ = false; | 794 was_marked_incrementally_ = false; |
798 } | 795 } |
799 | 796 |
800 // Don't start compaction if we are in the middle of incremental | 797 // Don't start compaction if we are in the middle of incremental |
801 // marking cycle. We did not collect any slots. | 798 // marking cycle. We did not collect any slots. |
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2053 code->CodeIterateBody(visitor); | 2050 code->CodeIterateBody(visitor); |
2054 } | 2051 } |
2055 ProcessMarkingDeque(); | 2052 ProcessMarkingDeque(); |
2056 return; | 2053 return; |
2057 } | 2054 } |
2058 } | 2055 } |
2059 } | 2056 } |
2060 | 2057 |
2061 | 2058 |
2062 void MarkCompactCollector::RetainMaps() { | 2059 void MarkCompactCollector::RetainMaps() { |
2063 if (reduce_memory_footprint_ || abort_incremental_marking_ || | 2060 if (heap()->ShouldReduceMemory() || heap()->ShouldAbortIncrementalMarking() || |
2064 FLAG_retain_maps_for_n_gc == 0) { | 2061 FLAG_retain_maps_for_n_gc == 0) { |
2065 // Do not retain dead maps if flag disables it or there is | 2062 // Do not retain dead maps if flag disables it or there is |
2066 // - memory pressure (reduce_memory_footprint_), | 2063 // - memory pressure (reduce_memory_footprint_), |
2067 // - GC is requested by tests or dev-tools (abort_incremental_marking_). | 2064 // - GC is requested by tests or dev-tools (abort_incremental_marking_). |
2068 return; | 2065 return; |
2069 } | 2066 } |
2070 | 2067 |
2071 ArrayList* retained_maps = heap()->retained_maps(); | 2068 ArrayList* retained_maps = heap()->retained_maps(); |
2072 int length = retained_maps->Length(); | 2069 int length = retained_maps->Length(); |
2073 int new_length = 0; | 2070 int new_length = 0; |
(...skipping 2639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4713 SlotsBuffer* buffer = *buffer_address; | 4710 SlotsBuffer* buffer = *buffer_address; |
4714 while (buffer != NULL) { | 4711 while (buffer != NULL) { |
4715 SlotsBuffer* next_buffer = buffer->next(); | 4712 SlotsBuffer* next_buffer = buffer->next(); |
4716 DeallocateBuffer(buffer); | 4713 DeallocateBuffer(buffer); |
4717 buffer = next_buffer; | 4714 buffer = next_buffer; |
4718 } | 4715 } |
4719 *buffer_address = NULL; | 4716 *buffer_address = NULL; |
4720 } | 4717 } |
4721 } // namespace internal | 4718 } // namespace internal |
4722 } // namespace v8 | 4719 } // namespace v8 |
OLD | NEW |