xref: /aosp_15_r20/art/runtime/gc/collector/semi_space.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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