| 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/base/sys-info.h" | 9 #include "src/base/sys-info.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 2089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2100 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_MARK); | 2100 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_MARK); |
| 2101 double start_time = 0.0; | 2101 double start_time = 0.0; |
| 2102 if (FLAG_print_cumulative_gc_stat) { | 2102 if (FLAG_print_cumulative_gc_stat) { |
| 2103 start_time = base::OS::TimeCurrentMillis(); | 2103 start_time = base::OS::TimeCurrentMillis(); |
| 2104 } | 2104 } |
| 2105 // The recursive GC marker detects when it is nearing stack overflow, | 2105 // The recursive GC marker detects when it is nearing stack overflow, |
| 2106 // and switches to a different marking system. JS interrupts interfere | 2106 // and switches to a different marking system. JS interrupts interfere |
| 2107 // with the C stack limit check. | 2107 // with the C stack limit check. |
| 2108 PostponeInterruptsScope postpone(isolate()); | 2108 PostponeInterruptsScope postpone(isolate()); |
| 2109 | 2109 |
| 2110 IncrementalMarking* incremental_marking = heap_->incremental_marking(); | 2110 { |
| 2111 if (was_marked_incrementally_) { | 2111 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_MARK_INC); |
| 2112 incremental_marking->Finalize(); | 2112 IncrementalMarking* incremental_marking = heap_->incremental_marking(); |
| 2113 } else { | 2113 if (was_marked_incrementally_) { |
| 2114 // Abort any pending incremental activities e.g. incremental sweeping. | 2114 incremental_marking->Finalize(); |
| 2115 incremental_marking->Stop(); | 2115 } else { |
| 2116 if (marking_deque_.in_use()) { | 2116 // Abort any pending incremental activities e.g. incremental sweeping. |
| 2117 marking_deque_.Uninitialize(true); | 2117 incremental_marking->Stop(); |
| 2118 if (marking_deque_.in_use()) { |
| 2119 marking_deque_.Uninitialize(true); |
| 2120 } |
| 2118 } | 2121 } |
| 2119 } | 2122 } |
| 2120 | 2123 |
| 2121 #ifdef DEBUG | 2124 #ifdef DEBUG |
| 2122 DCHECK(state_ == PREPARE_GC); | 2125 DCHECK(state_ == PREPARE_GC); |
| 2123 state_ = MARK_LIVE_OBJECTS; | 2126 state_ = MARK_LIVE_OBJECTS; |
| 2124 #endif | 2127 #endif |
| 2125 | 2128 |
| 2126 EnsureMarkingDequeIsCommittedAndInitialize( | 2129 EnsureMarkingDequeIsCommittedAndInitialize( |
| 2127 MarkCompactCollector::kMaxMarkingDequeSize); | 2130 MarkCompactCollector::kMaxMarkingDequeSize); |
| 2128 | 2131 |
| 2129 PrepareForCodeFlushing(); | 2132 { |
| 2133 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2134 GCTracer::Scope::MC_MARK_PREPCODEFLUSH); |
| 2135 PrepareForCodeFlushing(); |
| 2136 } |
| 2130 | 2137 |
| 2131 RootMarkingVisitor root_visitor(heap()); | 2138 RootMarkingVisitor root_visitor(heap()); |
| 2132 MarkRoots(&root_visitor); | |
| 2133 | 2139 |
| 2134 ProcessTopOptimizedFrame(&root_visitor); | 2140 { |
| 2141 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_MARK_ROOT); |
| 2142 MarkRoots(&root_visitor); |
| 2143 } |
| 2144 |
| 2145 { |
| 2146 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_MARK_TOPOPT); |
| 2147 ProcessTopOptimizedFrame(&root_visitor); |
| 2148 } |
| 2135 | 2149 |
| 2136 // Retaining dying maps should happen before or during ephemeral marking | 2150 // Retaining dying maps should happen before or during ephemeral marking |
| 2137 // because a map could keep the key of an ephemeron alive. Note that map | 2151 // because a map could keep the key of an ephemeron alive. Note that map |
| 2138 // aging is imprecise: maps that are kept alive only by ephemerons will age. | 2152 // aging is imprecise: maps that are kept alive only by ephemerons will age. |
| 2139 RetainMaps(); | 2153 { |
| 2154 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2155 GCTracer::Scope::MC_MARK_RETAINMAPS); |
| 2156 RetainMaps(); |
| 2157 } |
| 2140 | 2158 |
| 2141 { | 2159 { |
| 2142 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_WEAKCLOSURE); | 2160 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2161 GCTracer::Scope::MC_MARK_WEAKCLOSURE); |
| 2143 | 2162 |
| 2144 // The objects reachable from the roots are marked, yet unreachable | 2163 // The objects reachable from the roots are marked, yet unreachable |
| 2145 // objects are unmarked. Mark objects reachable due to host | 2164 // objects are unmarked. Mark objects reachable due to host |
| 2146 // application specific logic or through Harmony weak maps. | 2165 // application specific logic or through Harmony weak maps. |
| 2147 ProcessEphemeralMarking(&root_visitor, false); | 2166 ProcessEphemeralMarking(&root_visitor, false); |
| 2148 | 2167 |
| 2149 // The objects reachable from the roots, weak maps or object groups | 2168 // The objects reachable from the roots, weak maps or object groups |
| 2150 // are marked. Objects pointed to only by weak global handles cannot be | 2169 // are marked. Objects pointed to only by weak global handles cannot be |
| 2151 // immediately reclaimed. Instead, we have to mark them as pending and mark | 2170 // immediately reclaimed. Instead, we have to mark them as pending and mark |
| 2152 // objects reachable from them. | 2171 // objects reachable from them. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2169 | 2188 |
| 2170 AfterMarking(); | 2189 AfterMarking(); |
| 2171 | 2190 |
| 2172 if (FLAG_print_cumulative_gc_stat) { | 2191 if (FLAG_print_cumulative_gc_stat) { |
| 2173 heap_->tracer()->AddMarkingTime(base::OS::TimeCurrentMillis() - start_time); | 2192 heap_->tracer()->AddMarkingTime(base::OS::TimeCurrentMillis() - start_time); |
| 2174 } | 2193 } |
| 2175 } | 2194 } |
| 2176 | 2195 |
| 2177 | 2196 |
| 2178 void MarkCompactCollector::AfterMarking() { | 2197 void MarkCompactCollector::AfterMarking() { |
| 2179 // Prune the string table removing all strings only pointed to by the | 2198 { |
| 2180 // string table. Cannot use string_table() here because the string | 2199 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2181 // table is marked. | 2200 GCTracer::Scope::MC_MARK_STRINGTABLE); |
| 2182 StringTable* string_table = heap()->string_table(); | |
| 2183 InternalizedStringTableCleaner internalized_visitor(heap()); | |
| 2184 string_table->IterateElements(&internalized_visitor); | |
| 2185 string_table->ElementsRemoved(internalized_visitor.PointersRemoved()); | |
| 2186 | 2201 |
| 2187 ExternalStringTableCleaner external_visitor(heap()); | 2202 // Prune the string table removing all strings only pointed to by the |
| 2188 heap()->external_string_table_.Iterate(&external_visitor); | 2203 // string table. Cannot use string_table() here because the string |
| 2189 heap()->external_string_table_.CleanUp(); | 2204 // table is marked. |
| 2205 StringTable* string_table = heap()->string_table(); |
| 2206 InternalizedStringTableCleaner internalized_visitor(heap()); |
| 2207 string_table->IterateElements(&internalized_visitor); |
| 2208 string_table->ElementsRemoved(internalized_visitor.PointersRemoved()); |
| 2190 | 2209 |
| 2191 // Process the weak references. | 2210 ExternalStringTableCleaner external_visitor(heap()); |
| 2192 MarkCompactWeakObjectRetainer mark_compact_object_retainer; | 2211 heap()->external_string_table_.Iterate(&external_visitor); |
| 2193 heap()->ProcessAllWeakReferences(&mark_compact_object_retainer); | 2212 heap()->external_string_table_.CleanUp(); |
| 2213 } |
| 2194 | 2214 |
| 2195 // Remove object groups after marking phase. | 2215 { |
| 2196 heap()->isolate()->global_handles()->RemoveObjectGroups(); | 2216 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2197 heap()->isolate()->global_handles()->RemoveImplicitRefGroups(); | 2217 GCTracer::Scope::MC_MARK_WEAKREFS); |
| 2218 |
| 2219 // Process the weak references. |
| 2220 MarkCompactWeakObjectRetainer mark_compact_object_retainer; |
| 2221 heap()->ProcessAllWeakReferences(&mark_compact_object_retainer); |
| 2222 } |
| 2223 |
| 2224 { |
| 2225 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2226 GCTracer::Scope::MC_MARK_GLOBALHANDLES); |
| 2227 |
| 2228 // Remove object groups after marking phase. |
| 2229 heap()->isolate()->global_handles()->RemoveObjectGroups(); |
| 2230 heap()->isolate()->global_handles()->RemoveImplicitRefGroups(); |
| 2231 } |
| 2198 | 2232 |
| 2199 // Flush code from collected candidates. | 2233 // Flush code from collected candidates. |
| 2200 if (is_code_flushing_enabled()) { | 2234 if (is_code_flushing_enabled()) { |
| 2235 GCTracer::Scope gc_scope(heap()->tracer(), |
| 2236 GCTracer::Scope::MC_MARK_CODEFLUSH); |
| 2201 code_flusher_->ProcessCandidates(); | 2237 code_flusher_->ProcessCandidates(); |
| 2202 } | 2238 } |
| 2203 | 2239 |
| 2204 if (FLAG_track_gc_object_stats) { | 2240 if (FLAG_track_gc_object_stats) { |
| 2205 if (FLAG_trace_gc_object_stats) { | 2241 if (FLAG_trace_gc_object_stats) { |
| 2206 heap()->object_stats_->TraceObjectStats(); | 2242 heap()->object_stats_->TraceObjectStats(); |
| 2207 } | 2243 } |
| 2208 heap()->object_stats_->CheckpointObjectStats(); | 2244 heap()->object_stats_->CheckpointObjectStats(); |
| 2209 } | 2245 } |
| 2210 } | 2246 } |
| (...skipping 2391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4602 MarkBit mark_bit = Marking::MarkBitFrom(host); | 4638 MarkBit mark_bit = Marking::MarkBitFrom(host); |
| 4603 if (Marking::IsBlack(mark_bit)) { | 4639 if (Marking::IsBlack(mark_bit)) { |
| 4604 RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host); | 4640 RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host); |
| 4605 RecordRelocSlot(&rinfo, target); | 4641 RecordRelocSlot(&rinfo, target); |
| 4606 } | 4642 } |
| 4607 } | 4643 } |
| 4608 } | 4644 } |
| 4609 | 4645 |
| 4610 } // namespace internal | 4646 } // namespace internal |
| 4611 } // namespace v8 | 4647 } // namespace v8 |
| OLD | NEW |