1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2013 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_SEMI_SPACE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_COLLECTOR_SEMI_SPACE_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 "base/locks.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 25*795d594fSAndroid Build Coastguard Worker #include "garbage_collector.h" 26*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/heap_bitmap.h" 27*795d594fSAndroid Build Coastguard Worker #include "gc_root.h" 28*795d594fSAndroid Build Coastguard Worker #include "immune_spaces.h" 29*795d594fSAndroid Build Coastguard Worker #include "mirror/object_reference.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 class Thread; 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker namespace mirror { 37*795d594fSAndroid Build Coastguard Worker class Class; 38*795d594fSAndroid Build Coastguard Worker class Object; 39*795d594fSAndroid Build Coastguard Worker } // namespace mirror 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker namespace gc { 42*795d594fSAndroid Build Coastguard Worker class Heap; 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker namespace space { 45*795d594fSAndroid Build Coastguard Worker class ContinuousMemMapAllocSpace; 46*795d594fSAndroid Build Coastguard Worker class ContinuousSpace; 47*795d594fSAndroid Build Coastguard Worker } // namespace space 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker namespace collector { 50*795d594fSAndroid Build Coastguard Worker class SemiSpace : public GarbageCollector { 51*795d594fSAndroid Build Coastguard Worker public: 52*795d594fSAndroid Build Coastguard Worker // If true, use remembered sets in the generational mode. 53*795d594fSAndroid Build Coastguard Worker static constexpr bool kUseRememberedSet = true; 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker explicit SemiSpace(Heap* heap, const std::string& name_prefix = ""); 56*795d594fSAndroid Build Coastguard Worker ~SemiSpace()57*795d594fSAndroid Build Coastguard Worker ~SemiSpace() {} 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker void RunPhases() override NO_THREAD_SAFETY_ANALYSIS; 60*795d594fSAndroid Build Coastguard Worker virtual void InitializePhase(); 61*795d594fSAndroid Build Coastguard Worker virtual void MarkingPhase() REQUIRES(Locks::mutator_lock_) 62*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::heap_bitmap_lock_); 63*795d594fSAndroid Build Coastguard Worker virtual void ReclaimPhase() REQUIRES(Locks::mutator_lock_) 64*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::heap_bitmap_lock_); 65*795d594fSAndroid Build Coastguard Worker virtual void FinishPhase() REQUIRES(Locks::mutator_lock_); 66*795d594fSAndroid Build Coastguard Worker void MarkReachableObjects() 67*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_, Locks::heap_bitmap_lock_); GetGcType()68*795d594fSAndroid Build Coastguard Worker GcType GetGcType() const override { 69*795d594fSAndroid Build Coastguard Worker return kGcTypePartial; 70*795d594fSAndroid Build Coastguard Worker } GetCollectorType()71*795d594fSAndroid Build Coastguard Worker CollectorType GetCollectorType() const override { 72*795d594fSAndroid Build Coastguard Worker return kCollectorTypeSS; 73*795d594fSAndroid Build Coastguard Worker } 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker // Sets which space we will be copying objects to. 76*795d594fSAndroid Build Coastguard Worker void SetToSpace(space::ContinuousMemMapAllocSpace* to_space); 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker // Set the space where we copy objects from. 79*795d594fSAndroid Build Coastguard Worker void SetFromSpace(space::ContinuousMemMapAllocSpace* from_space); 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker // Set whether or not we swap the semi spaces in the heap. This needs to be done with mutators 82*795d594fSAndroid Build Coastguard Worker // suspended. SetSwapSemiSpaces(bool swap_semi_spaces)83*795d594fSAndroid Build Coastguard Worker void SetSwapSemiSpaces(bool swap_semi_spaces) { 84*795d594fSAndroid Build Coastguard Worker swap_semi_spaces_ = swap_semi_spaces; 85*795d594fSAndroid Build Coastguard Worker } 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker // Initializes internal structures. 88*795d594fSAndroid Build Coastguard Worker void Init(); 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker // Find the default mark bitmap. 91*795d594fSAndroid Build Coastguard Worker void FindDefaultMarkBitmap(); 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker // Updates obj_ptr if the object has moved. Takes either an ObjectReference or a HeapReference. 94*795d594fSAndroid Build Coastguard Worker template<typename CompressedReferenceType> 95*795d594fSAndroid Build Coastguard Worker void MarkObject(CompressedReferenceType* obj_ptr) 96*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker template<typename CompressedReferenceType> 99*795d594fSAndroid Build Coastguard Worker void MarkObjectIfNotInToSpace(CompressedReferenceType* obj_ptr) 100*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker mirror::Object* MarkObject(mirror::Object* root) override 103*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker void MarkHeapReference(mirror::HeapReference<mirror::Object>* obj_ptr, 106*795d594fSAndroid Build Coastguard Worker bool do_atomic_update) override 107*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker void ScanObject(mirror::Object* obj) 110*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker void VerifyNoFromSpaceReferences(mirror::Object* obj) 113*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker // Marks the root set at the start of a garbage collection. 116*795d594fSAndroid Build Coastguard Worker void MarkRoots() 117*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker // Bind the live bits to the mark bits of bitmaps for spaces that are never collected, ie 120*795d594fSAndroid Build Coastguard Worker // the image. Mark that portion of the heap as immune. 121*795d594fSAndroid Build Coastguard Worker virtual void BindBitmaps() REQUIRES_SHARED(Locks::mutator_lock_) 122*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::heap_bitmap_lock_); 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker void UnBindBitmaps() 125*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_); 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker void ProcessReferences(Thread* self) REQUIRES(Locks::mutator_lock_) 128*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_); 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker // Sweeps unmarked objects to complete the garbage collection. 131*795d594fSAndroid Build Coastguard Worker virtual void Sweep(bool swap_bitmaps) 132*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 133*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker // Sweeps unmarked objects to complete the garbage collection. 136*795d594fSAndroid Build Coastguard Worker void SweepLargeObjects(bool swap_bitmaps) REQUIRES(Locks::heap_bitmap_lock_); 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker void SweepSystemWeaks() 139*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_) REQUIRES(Locks::mutator_lock_); 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker void VisitRoots(mirror::Object*** roots, size_t count, const RootInfo& info) override 142*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_, Locks::heap_bitmap_lock_); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker void VisitRoots(mirror::CompressedReference<mirror::Object>** roots, 145*795d594fSAndroid Build Coastguard Worker size_t count, 146*795d594fSAndroid Build Coastguard Worker const RootInfo& info) override 147*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_, Locks::heap_bitmap_lock_); 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker virtual mirror::Object* MarkNonForwardedObject(mirror::Object* obj) 150*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker // Schedules an unmarked object for reference processing. 153*795d594fSAndroid Build Coastguard Worker void DelayReferenceReferent(ObjPtr<mirror::Class> klass, ObjPtr<mirror::Reference> reference) 154*795d594fSAndroid Build Coastguard Worker override REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_); 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker protected: 157*795d594fSAndroid Build Coastguard Worker // Returns null if the object is not marked, otherwise returns the forwarding address (same as 158*795d594fSAndroid Build Coastguard Worker // object for non movable things). 159*795d594fSAndroid Build Coastguard Worker mirror::Object* IsMarked(mirror::Object* object) override 160*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_) 161*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_); 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker bool IsNullOrMarkedHeapReference(mirror::HeapReference<mirror::Object>* object, 164*795d594fSAndroid Build Coastguard Worker bool do_atomic_update) override 165*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_) 166*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::heap_bitmap_lock_); 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker // Marks or unmarks a large object based on whether or not set is true. If set is true, then we 169*795d594fSAndroid Build Coastguard Worker // mark, otherwise we unmark. 170*795d594fSAndroid Build Coastguard Worker bool MarkLargeObject(const mirror::Object* obj) 171*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 172*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker // Expand mark stack to 2x its current size. 175*795d594fSAndroid Build Coastguard Worker void ResizeMarkStack(size_t new_size) REQUIRES_SHARED(Locks::mutator_lock_); 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // Returns true if we should sweep the space. 178*795d594fSAndroid Build Coastguard Worker virtual bool ShouldSweepSpace(space::ContinuousSpace* space) const; 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker // Push an object onto the mark stack. 181*795d594fSAndroid Build Coastguard Worker void MarkStackPush(mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker void UpdateAndMarkModUnion() 184*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 185*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 186*795d594fSAndroid Build Coastguard Worker 187*795d594fSAndroid Build Coastguard Worker // Recursively blackens objects on the mark stack. 188*795d594fSAndroid Build Coastguard Worker void ProcessMarkStack() override 189*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_, Locks::heap_bitmap_lock_); 190*795d594fSAndroid Build Coastguard Worker 191*795d594fSAndroid Build Coastguard Worker inline mirror::Object* GetForwardingAddressInFromSpace(mirror::Object* obj) const 192*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker // Revoke all the thread-local buffers. 195*795d594fSAndroid Build Coastguard Worker void RevokeAllThreadLocalBuffers() override; 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker // Current space, we check this space first to avoid searching for the appropriate space for an 198*795d594fSAndroid Build Coastguard Worker // object. 199*795d594fSAndroid Build Coastguard Worker accounting::ObjectStack* mark_stack_; 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker // Every object inside the immune spaces is assumed to be marked. 202*795d594fSAndroid Build Coastguard Worker ImmuneSpaces immune_spaces_; 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker // Destination and source spaces (can be any type of ContinuousMemMapAllocSpace which either has 205*795d594fSAndroid Build Coastguard Worker // a live bitmap or doesn't). 206*795d594fSAndroid Build Coastguard Worker space::ContinuousMemMapAllocSpace* to_space_; 207*795d594fSAndroid Build Coastguard Worker // Cached live bitmap as an optimization. 208*795d594fSAndroid Build Coastguard Worker accounting::ContinuousSpaceBitmap* to_space_live_bitmap_; 209*795d594fSAndroid Build Coastguard Worker space::ContinuousMemMapAllocSpace* from_space_; 210*795d594fSAndroid Build Coastguard Worker // Cached mark bitmap as an optimization. 211*795d594fSAndroid Build Coastguard Worker accounting::HeapBitmap* mark_bitmap_; 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker Thread* self_; 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker // The space which we copy to if the to_space_ is full. 216*795d594fSAndroid Build Coastguard Worker space::ContinuousMemMapAllocSpace* fallback_space_; 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker // How many objects and bytes we moved, used so that we don't need to Get the size of the 219*795d594fSAndroid Build Coastguard Worker // to_space_ when calculating how many objects and bytes we freed. 220*795d594fSAndroid Build Coastguard Worker size_t bytes_moved_; 221*795d594fSAndroid Build Coastguard Worker size_t objects_moved_; 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker // How many bytes we avoided dirtying. 224*795d594fSAndroid Build Coastguard Worker size_t saved_bytes_; 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker // The name of the collector. 227*795d594fSAndroid Build Coastguard Worker std::string collector_name_; 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker // Used for the generational mode. The default interval of the whole 230*795d594fSAndroid Build Coastguard Worker // heap collection. If N, the whole heap collection occurs every N 231*795d594fSAndroid Build Coastguard Worker // collections. 232*795d594fSAndroid Build Coastguard Worker static constexpr int kDefaultWholeHeapCollectionInterval = 5; 233*795d594fSAndroid Build Coastguard Worker 234*795d594fSAndroid Build Coastguard Worker // Whether or not we swap the semi spaces in the heap during the marking phase. 235*795d594fSAndroid Build Coastguard Worker bool swap_semi_spaces_; 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker private: 238*795d594fSAndroid Build Coastguard Worker class BitmapSetSlowPathVisitor; 239*795d594fSAndroid Build Coastguard Worker class MarkObjectVisitor; 240*795d594fSAndroid Build Coastguard Worker class VerifyNoFromSpaceReferencesVisitor; 241*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(SemiSpace); 242*795d594fSAndroid Build Coastguard Worker }; 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker } // namespace collector 245*795d594fSAndroid Build Coastguard Worker } // namespace gc 246*795d594fSAndroid Build Coastguard Worker } // namespace art 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_GC_COLLECTOR_SEMI_SPACE_H_ 249