1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <memory> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/atomic.h" 23*795d594fSAndroid Build Coastguard Worker #include "barrier.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 25*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 26*795d594fSAndroid Build Coastguard Worker #include "garbage_collector.h" 27*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/heap_bitmap.h" 28*795d594fSAndroid Build Coastguard Worker #include "gc_root.h" 29*795d594fSAndroid Build Coastguard Worker #include "immune_spaces.h" 30*795d594fSAndroid Build Coastguard Worker #include "offsets.h" 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker namespace mirror { 35*795d594fSAndroid Build Coastguard Worker class Class; 36*795d594fSAndroid Build Coastguard Worker class Object; 37*795d594fSAndroid Build Coastguard Worker class Reference; 38*795d594fSAndroid Build Coastguard Worker } // namespace mirror 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker class Thread; 41*795d594fSAndroid Build Coastguard Worker enum VisitRootFlags : uint8_t; 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker namespace gc { 44*795d594fSAndroid Build Coastguard Worker class Heap; 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker namespace collector { 47*795d594fSAndroid Build Coastguard Worker class MarkSweep : public GarbageCollector { 48*795d594fSAndroid Build Coastguard Worker public: 49*795d594fSAndroid Build Coastguard Worker MarkSweep(Heap* heap, bool is_concurrent, const std::string& name_prefix = ""); 50*795d594fSAndroid Build Coastguard Worker ~MarkSweep()51*795d594fSAndroid Build Coastguard Worker ~MarkSweep() {} 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker void RunPhases() override REQUIRES(!mark_stack_lock_); 54*795d594fSAndroid Build Coastguard Worker void InitializePhase(); 55*795d594fSAndroid Build Coastguard Worker void MarkingPhase() REQUIRES(!mark_stack_lock_) REQUIRES_SHARED(Locks::mutator_lock_); 56*795d594fSAndroid Build Coastguard Worker void PausePhase() REQUIRES(Locks::mutator_lock_) REQUIRES(!mark_stack_lock_); 57*795d594fSAndroid Build Coastguard Worker void ReclaimPhase() REQUIRES(!mark_stack_lock_) REQUIRES_SHARED(Locks::mutator_lock_); 58*795d594fSAndroid Build Coastguard Worker void FinishPhase(); 59*795d594fSAndroid Build Coastguard Worker virtual void MarkReachableObjects() 60*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 61*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 62*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 63*795d594fSAndroid Build Coastguard Worker IsConcurrent()64*795d594fSAndroid Build Coastguard Worker bool IsConcurrent() const { 65*795d594fSAndroid Build Coastguard Worker return is_concurrent_; 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker GetGcType()68*795d594fSAndroid Build Coastguard Worker GcType GetGcType() const override { 69*795d594fSAndroid Build Coastguard Worker return kGcTypeFull; 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker GetCollectorType()72*795d594fSAndroid Build Coastguard Worker CollectorType GetCollectorType() const override { 73*795d594fSAndroid Build Coastguard Worker return is_concurrent_ ? kCollectorTypeCMS : kCollectorTypeMS; 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker // Initializes internal structures. 77*795d594fSAndroid Build Coastguard Worker void Init(); 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker // Find the default mark bitmap. 80*795d594fSAndroid Build Coastguard Worker void FindDefaultSpaceBitmap() REQUIRES_SHARED(Locks::mutator_lock_); 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker // Marks all objects in the root set at the start of a garbage collection. 83*795d594fSAndroid Build Coastguard Worker void MarkRoots(Thread* self) 84*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 85*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 86*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker void MarkNonThreadRoots() 89*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 90*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 91*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker virtual void MarkConcurrentRoots(VisitRootFlags flags) 94*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 95*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 96*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker void MarkRootsCheckpoint(Thread* self, bool revoke_ros_alloc_thread_local_buffers_at_checkpoint) 99*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 100*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 101*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker // Builds a mark stack and recursively mark until it empties. 104*795d594fSAndroid Build Coastguard Worker void RecursiveMark() 105*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 106*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 107*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker // Bind the live bits to the mark bits of bitmaps for spaces that are never collected, ie 110*795d594fSAndroid Build Coastguard Worker // the image. Mark that portion of the heap as immune. 111*795d594fSAndroid Build Coastguard Worker virtual void BindBitmaps() REQUIRES_SHARED(Locks::mutator_lock_); 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker // Builds a mark stack with objects on dirty cards and recursively mark until it empties. 114*795d594fSAndroid Build Coastguard Worker void RecursiveMarkDirtyObjects(bool paused, uint8_t minimum_age) 115*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 116*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 117*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker // Remarks the root set after completing the concurrent mark. 120*795d594fSAndroid Build Coastguard Worker void ReMarkRoots() 121*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 122*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 123*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker void ProcessReferences(Thread* self) 126*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 127*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker // Update and mark references from immune spaces. 130*795d594fSAndroid Build Coastguard Worker void UpdateAndMarkModUnion() 131*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 132*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker // Pre clean cards to reduce how much work is needed in the pause. 135*795d594fSAndroid Build Coastguard Worker void PreCleanCards() 136*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 137*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 138*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker // Sweeps unmarked objects to complete the garbage collection. Virtual as by default it sweeps 141*795d594fSAndroid Build Coastguard Worker // all allocation spaces. Partial and sticky GCs want to just sweep a subset of the heap. 142*795d594fSAndroid Build Coastguard Worker virtual void Sweep(bool swap_bitmaps) 143*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 144*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker // Sweeps unmarked objects to complete the garbage collection. 147*795d594fSAndroid Build Coastguard Worker void SweepLargeObjects(bool swap_bitmaps) REQUIRES(Locks::heap_bitmap_lock_); 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker void SweepArray(accounting::ObjectStack* obj_arr, bool swap_bitmaps) 150*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) REQUIRES_SHARED(Locks::mutator_lock_); 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker // Blackens an object. 153*795d594fSAndroid Build Coastguard Worker void ScanObject(mirror::Object* obj) 154*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 155*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 156*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 157*795d594fSAndroid Build Coastguard Worker 158*795d594fSAndroid Build Coastguard Worker // No thread safety analysis due to lambdas. 159*795d594fSAndroid Build Coastguard Worker template<typename MarkVisitor, typename ReferenceVisitor> 160*795d594fSAndroid Build Coastguard Worker void ScanObjectVisit(mirror::Object* obj, 161*795d594fSAndroid Build Coastguard Worker const MarkVisitor& visitor, 162*795d594fSAndroid Build Coastguard Worker const ReferenceVisitor& ref_visitor) 163*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 164*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 165*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker void SweepSystemWeaks(Thread* self) 168*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::heap_bitmap_lock_) 169*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker static mirror::Object* VerifySystemWeakIsLiveCallback(mirror::Object* obj, void* arg) 172*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker void VerifySystemWeaks() 175*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_) REQUIRES_SHARED(Locks::heap_bitmap_lock_); 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // Verify that an object is live, either in a live bitmap or in the allocation stack. 178*795d594fSAndroid Build Coastguard Worker void VerifyIsLive(const mirror::Object* obj) 179*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_, Locks::heap_bitmap_lock_); 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker bool IsNullOrMarkedHeapReference(mirror::HeapReference<mirror::Object>* ref, 182*795d594fSAndroid Build Coastguard Worker bool do_atomic_update) override 183*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 184*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker void VisitRoots(mirror::Object*** roots, size_t count, const RootInfo& info) override 187*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 188*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 189*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 190*795d594fSAndroid Build Coastguard Worker 191*795d594fSAndroid Build Coastguard Worker void VisitRoots(mirror::CompressedReference<mirror::Object>** roots, 192*795d594fSAndroid Build Coastguard Worker size_t count, 193*795d594fSAndroid Build Coastguard Worker const RootInfo& info) override 194*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 195*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 196*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker // Marks an object. 199*795d594fSAndroid Build Coastguard Worker mirror::Object* MarkObject(mirror::Object* obj) override 200*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 201*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 202*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker void MarkObject(mirror::Object* obj, mirror::Object* holder, MemberOffset offset) 205*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 206*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 207*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker void MarkHeapReference(mirror::HeapReference<mirror::Object>* ref, 210*795d594fSAndroid Build Coastguard Worker bool do_atomic_update) override 211*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 212*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 213*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 214*795d594fSAndroid Build Coastguard Worker GetBarrier()215*795d594fSAndroid Build Coastguard Worker Barrier& GetBarrier() { 216*795d594fSAndroid Build Coastguard Worker return *gc_barrier_; 217*795d594fSAndroid Build Coastguard Worker } 218*795d594fSAndroid Build Coastguard Worker 219*795d594fSAndroid Build Coastguard Worker // Schedules an unmarked object for reference processing. 220*795d594fSAndroid Build Coastguard Worker void DelayReferenceReferent(ObjPtr<mirror::Class> klass, ObjPtr<mirror::Reference> reference) 221*795d594fSAndroid Build Coastguard Worker override REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker protected: 224*795d594fSAndroid Build Coastguard Worker // Returns object if the object is marked in the heap bitmap, otherwise null. 225*795d594fSAndroid Build Coastguard Worker mirror::Object* IsMarked(mirror::Object* object) override 226*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker void MarkObjectNonNull(mirror::Object* obj, 229*795d594fSAndroid Build Coastguard Worker mirror::Object* holder = nullptr, 230*795d594fSAndroid Build Coastguard Worker MemberOffset offset = MemberOffset(0)) 231*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 232*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 233*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 234*795d594fSAndroid Build Coastguard Worker 235*795d594fSAndroid Build Coastguard Worker // Marks an object atomically, safe to use from multiple threads. 236*795d594fSAndroid Build Coastguard Worker void MarkObjectNonNullParallel(mirror::Object* obj) 237*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 238*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker // Returns true if we need to add obj to a mark stack. 241*795d594fSAndroid Build Coastguard Worker bool MarkObjectParallel(mirror::Object* obj) NO_THREAD_SAFETY_ANALYSIS; 242*795d594fSAndroid Build Coastguard Worker 243*795d594fSAndroid Build Coastguard Worker // Verify the roots of the heap and print out information related to any invalid roots. 244*795d594fSAndroid Build Coastguard Worker // Called in MarkObject, so may we may not hold the mutator lock. 245*795d594fSAndroid Build Coastguard Worker void VerifySuspendedThreadRoots(std::ostream& os) 246*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker // Expand mark stack to 2x its current size. 249*795d594fSAndroid Build Coastguard Worker void ExpandMarkStack() 250*795d594fSAndroid Build Coastguard Worker REQUIRES(mark_stack_lock_) 251*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 252*795d594fSAndroid Build Coastguard Worker 253*795d594fSAndroid Build Coastguard Worker void ResizeMarkStack(size_t new_size) 254*795d594fSAndroid Build Coastguard Worker REQUIRES(mark_stack_lock_) 255*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker // Returns how many threads we should use for the current GC phase based on if we are paused, 258*795d594fSAndroid Build Coastguard Worker // whether or not we care about pauses. 259*795d594fSAndroid Build Coastguard Worker size_t GetThreadCount(bool paused) const; 260*795d594fSAndroid Build Coastguard Worker 261*795d594fSAndroid Build Coastguard Worker // Push a single reference on a mark stack. 262*795d594fSAndroid Build Coastguard Worker void PushOnMarkStack(mirror::Object* obj) 263*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 264*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker // Blackens objects grayed during a garbage collection. 267*795d594fSAndroid Build Coastguard Worker void ScanGrayObjects(bool paused, uint8_t minimum_age) 268*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 269*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 270*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 271*795d594fSAndroid Build Coastguard Worker ProcessMarkStack()272*795d594fSAndroid Build Coastguard Worker void ProcessMarkStack() override 273*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 274*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 275*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 276*795d594fSAndroid Build Coastguard Worker ProcessMarkStack(false); 277*795d594fSAndroid Build Coastguard Worker } 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker // Recursively blackens objects on the mark stack. 280*795d594fSAndroid Build Coastguard Worker void ProcessMarkStack(bool paused) 281*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 282*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 283*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 284*795d594fSAndroid Build Coastguard Worker 285*795d594fSAndroid Build Coastguard Worker void ProcessMarkStackParallel(size_t thread_count) 286*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 287*795d594fSAndroid Build Coastguard Worker REQUIRES(!mark_stack_lock_) 288*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 289*795d594fSAndroid Build Coastguard Worker 290*795d594fSAndroid Build Coastguard Worker // Used to Get around thread safety annotations. The call is from MarkingPhase and is guarded by 291*795d594fSAndroid Build Coastguard Worker // IsExclusiveHeld. 292*795d594fSAndroid Build Coastguard Worker void RevokeAllThreadLocalAllocationStacks(Thread* self) NO_THREAD_SAFETY_ANALYSIS; 293*795d594fSAndroid Build Coastguard Worker 294*795d594fSAndroid Build Coastguard Worker // Revoke all the thread-local buffers. 295*795d594fSAndroid Build Coastguard Worker void RevokeAllThreadLocalBuffers() override; 296*795d594fSAndroid Build Coastguard Worker 297*795d594fSAndroid Build Coastguard Worker // Whether or not we count how many of each type of object were scanned. 298*795d594fSAndroid Build Coastguard Worker static constexpr bool kCountScannedTypes = false; 299*795d594fSAndroid Build Coastguard Worker 300*795d594fSAndroid Build Coastguard Worker // Current space, we check this space first to avoid searching for the appropriate space for an 301*795d594fSAndroid Build Coastguard Worker // object. 302*795d594fSAndroid Build Coastguard Worker accounting::ContinuousSpaceBitmap* current_space_bitmap_; 303*795d594fSAndroid Build Coastguard Worker // Cache the heap's mark bitmap to prevent having to do 2 loads during slow path marking. 304*795d594fSAndroid Build Coastguard Worker accounting::HeapBitmap* mark_bitmap_; 305*795d594fSAndroid Build Coastguard Worker 306*795d594fSAndroid Build Coastguard Worker accounting::ObjectStack* mark_stack_; 307*795d594fSAndroid Build Coastguard Worker 308*795d594fSAndroid Build Coastguard Worker // Every object inside the immune spaces is assumed to be marked. Immune spaces that aren't in the 309*795d594fSAndroid Build Coastguard Worker // immune region are handled by the normal marking logic. 310*795d594fSAndroid Build Coastguard Worker ImmuneSpaces immune_spaces_; 311*795d594fSAndroid Build Coastguard Worker 312*795d594fSAndroid Build Coastguard Worker // Parallel finger. 313*795d594fSAndroid Build Coastguard Worker AtomicInteger atomic_finger_; 314*795d594fSAndroid Build Coastguard Worker 315*795d594fSAndroid Build Coastguard Worker AtomicInteger no_reference_class_count_; 316*795d594fSAndroid Build Coastguard Worker AtomicInteger normal_count_; 317*795d594fSAndroid Build Coastguard Worker // Number of classes scanned, if kCountScannedTypes. 318*795d594fSAndroid Build Coastguard Worker AtomicInteger class_count_; 319*795d594fSAndroid Build Coastguard Worker // Number of object arrays scanned, if kCountScannedTypes. 320*795d594fSAndroid Build Coastguard Worker AtomicInteger object_array_count_; 321*795d594fSAndroid Build Coastguard Worker // Number of non-class/arrays scanned, if kCountScannedTypes. 322*795d594fSAndroid Build Coastguard Worker AtomicInteger other_count_; 323*795d594fSAndroid Build Coastguard Worker // Number of java.lang.ref.Reference instances. 324*795d594fSAndroid Build Coastguard Worker AtomicInteger reference_count_; 325*795d594fSAndroid Build Coastguard Worker 326*795d594fSAndroid Build Coastguard Worker AtomicInteger large_object_test_; 327*795d594fSAndroid Build Coastguard Worker AtomicInteger large_object_mark_; 328*795d594fSAndroid Build Coastguard Worker AtomicInteger overhead_time_; 329*795d594fSAndroid Build Coastguard Worker AtomicInteger work_chunks_created_; 330*795d594fSAndroid Build Coastguard Worker AtomicInteger work_chunks_deleted_; 331*795d594fSAndroid Build Coastguard Worker AtomicInteger mark_null_count_; 332*795d594fSAndroid Build Coastguard Worker AtomicInteger mark_immune_count_; 333*795d594fSAndroid Build Coastguard Worker AtomicInteger mark_fastpath_count_; 334*795d594fSAndroid Build Coastguard Worker AtomicInteger mark_slowpath_count_; 335*795d594fSAndroid Build Coastguard Worker 336*795d594fSAndroid Build Coastguard Worker std::unique_ptr<Barrier> gc_barrier_; 337*795d594fSAndroid Build Coastguard Worker Mutex mark_stack_lock_ ACQUIRED_AFTER(Locks::classlinker_classes_lock_); 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker const bool is_concurrent_; 340*795d594fSAndroid Build Coastguard Worker 341*795d594fSAndroid Build Coastguard Worker // Verification. 342*795d594fSAndroid Build Coastguard Worker size_t live_stack_freeze_size_; 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker private: 345*795d594fSAndroid Build Coastguard Worker class CardScanTask; 346*795d594fSAndroid Build Coastguard Worker class CheckpointMarkThreadRoots; 347*795d594fSAndroid Build Coastguard Worker class DelayReferenceReferentVisitor; 348*795d594fSAndroid Build Coastguard Worker template<bool kUseFinger> class MarkStackTask; 349*795d594fSAndroid Build Coastguard Worker class MarkObjectSlowPath; 350*795d594fSAndroid Build Coastguard Worker class RecursiveMarkTask; 351*795d594fSAndroid Build Coastguard Worker class ScanObjectParallelVisitor; 352*795d594fSAndroid Build Coastguard Worker class ScanObjectVisitor; 353*795d594fSAndroid Build Coastguard Worker class VerifyRootMarkedVisitor; 354*795d594fSAndroid Build Coastguard Worker class VerifyRootVisitor; 355*795d594fSAndroid Build Coastguard Worker class VerifySystemWeakVisitor; 356*795d594fSAndroid Build Coastguard Worker 357*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(MarkSweep); 358*795d594fSAndroid Build Coastguard Worker }; 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker } // namespace collector 361*795d594fSAndroid Build Coastguard Worker } // namespace gc 362*795d594fSAndroid Build Coastguard Worker } // namespace art 363*795d594fSAndroid Build Coastguard Worker 364*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_ 365