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_SPACE_BUMP_POINTER_SPACE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_SPACE_BUMP_POINTER_SPACE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 21*795d594fSAndroid Build Coastguard Worker #include "space.h" 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker #include <deque> 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker namespace mirror { 28*795d594fSAndroid Build Coastguard Worker class Object; 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker namespace gc { 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker namespace collector { 34*795d594fSAndroid Build Coastguard Worker class MarkCompact; 35*795d594fSAndroid Build Coastguard Worker class MarkSweep; 36*795d594fSAndroid Build Coastguard Worker } // namespace collector 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker namespace space { 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker // A bump pointer space allocates by incrementing a pointer, it doesn't provide a free 41*795d594fSAndroid Build Coastguard Worker // implementation as its intended to be evacuated. 42*795d594fSAndroid Build Coastguard Worker class EXPORT BumpPointerSpace final : public ContinuousMemMapAllocSpace { 43*795d594fSAndroid Build Coastguard Worker public: 44*795d594fSAndroid Build Coastguard Worker using WalkCallback = void (*)(void *, void *, int, void *); 45*795d594fSAndroid Build Coastguard Worker GetType()46*795d594fSAndroid Build Coastguard Worker SpaceType GetType() const override { 47*795d594fSAndroid Build Coastguard Worker return kSpaceTypeBumpPointerSpace; 48*795d594fSAndroid Build Coastguard Worker } 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker // Create a bump pointer space with the requested sizes. The requested base address is not 51*795d594fSAndroid Build Coastguard Worker // guaranteed to be granted, if it is required, the caller should call Begin on the returned 52*795d594fSAndroid Build Coastguard Worker // space to confirm the request was granted. 53*795d594fSAndroid Build Coastguard Worker static BumpPointerSpace* Create(const std::string& name, size_t capacity); 54*795d594fSAndroid Build Coastguard Worker static BumpPointerSpace* CreateFromMemMap(const std::string& name, MemMap&& mem_map); 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker // Allocate num_bytes, returns null if the space is full. 57*795d594fSAndroid Build Coastguard Worker mirror::Object* Alloc(Thread* self, size_t num_bytes, size_t* bytes_allocated, 58*795d594fSAndroid Build Coastguard Worker size_t* usable_size, size_t* bytes_tl_bulk_allocated) override; 59*795d594fSAndroid Build Coastguard Worker // Thread-unsafe allocation for when mutators are suspended, used by the semispace collector. 60*795d594fSAndroid Build Coastguard Worker mirror::Object* AllocThreadUnsafe(Thread* self, size_t num_bytes, size_t* bytes_allocated, 61*795d594fSAndroid Build Coastguard Worker size_t* usable_size, size_t* bytes_tl_bulk_allocated) 62*795d594fSAndroid Build Coastguard Worker override REQUIRES(Locks::mutator_lock_); 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker mirror::Object* AllocNonvirtual(size_t num_bytes); 65*795d594fSAndroid Build Coastguard Worker mirror::Object* AllocNonvirtualWithoutAccounting(size_t num_bytes); 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker // Return the storage space required by obj. AllocationSize(mirror::Object * obj,size_t * usable_size)68*795d594fSAndroid Build Coastguard Worker size_t AllocationSize(mirror::Object* obj, size_t* usable_size) override 69*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 70*795d594fSAndroid Build Coastguard Worker return AllocationSizeNonvirtual(obj, usable_size); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker // NOPS unless we support free lists. Free(Thread *,mirror::Object *)74*795d594fSAndroid Build Coastguard Worker size_t Free(Thread*, mirror::Object*) override { 75*795d594fSAndroid Build Coastguard Worker return 0; 76*795d594fSAndroid Build Coastguard Worker } 77*795d594fSAndroid Build Coastguard Worker FreeList(Thread *,size_t,mirror::Object **)78*795d594fSAndroid Build Coastguard Worker size_t FreeList(Thread*, size_t, mirror::Object**) override { 79*795d594fSAndroid Build Coastguard Worker return 0; 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker size_t AllocationSizeNonvirtual(mirror::Object* obj, size_t* usable_size) 83*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker // Removes the fork time growth limit on capacity, allowing the application to allocate up to the 86*795d594fSAndroid Build Coastguard Worker // maximum reserved size of the heap. ClearGrowthLimit()87*795d594fSAndroid Build Coastguard Worker void ClearGrowthLimit() { 88*795d594fSAndroid Build Coastguard Worker growth_end_ = Limit(); 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker // Attempts to clamp the space limit to 'new_capacity'. If not possible, then 92*795d594fSAndroid Build Coastguard Worker // clamps to whatever possible. Returns the new capacity. 'lock_' is used to 93*795d594fSAndroid Build Coastguard Worker // ensure that TLAB allocations, which are the only ones which may be happening 94*795d594fSAndroid Build Coastguard Worker // concurrently with this function are synchronized. The other Alloc* functions 95*795d594fSAndroid Build Coastguard Worker // are either used in single-threaded mode, or when used in multi-threaded mode, 96*795d594fSAndroid Build Coastguard Worker // then the space is used by GCs (like SS) which don't have clamping implemented. 97*795d594fSAndroid Build Coastguard Worker size_t ClampGrowthLimit(size_t new_capacity) REQUIRES(!lock_); 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker // Override capacity so that we only return the possibly limited capacity Capacity()100*795d594fSAndroid Build Coastguard Worker size_t Capacity() const override { 101*795d594fSAndroid Build Coastguard Worker return growth_end_ - begin_; 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker // The total amount of memory reserved for the space. NonGrowthLimitCapacity()105*795d594fSAndroid Build Coastguard Worker size_t NonGrowthLimitCapacity() const override { 106*795d594fSAndroid Build Coastguard Worker return GetMemMap()->Size(); 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker GetLiveBitmap()109*795d594fSAndroid Build Coastguard Worker accounting::ContinuousSpaceBitmap* GetLiveBitmap() override { 110*795d594fSAndroid Build Coastguard Worker return nullptr; 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker // Reset the space to empty. 114*795d594fSAndroid Build Coastguard Worker void Clear() override REQUIRES(!lock_); 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker void Dump(std::ostream& os) const override; 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker size_t RevokeThreadLocalBuffers(Thread* thread) override REQUIRES(!lock_); 119*795d594fSAndroid Build Coastguard Worker size_t RevokeAllThreadLocalBuffers() override 120*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::runtime_shutdown_lock_, !Locks::thread_list_lock_, !lock_); 121*795d594fSAndroid Build Coastguard Worker void AssertThreadLocalBuffersAreRevoked(Thread* thread) REQUIRES(!lock_); 122*795d594fSAndroid Build Coastguard Worker void AssertAllThreadLocalBuffersAreRevoked() 123*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::runtime_shutdown_lock_, !Locks::thread_list_lock_, !lock_); 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker uint64_t GetBytesAllocated() override REQUIRES_SHARED(Locks::mutator_lock_) 126*795d594fSAndroid Build Coastguard Worker REQUIRES(!*Locks::runtime_shutdown_lock_, !*Locks::thread_list_lock_, !lock_); 127*795d594fSAndroid Build Coastguard Worker uint64_t GetObjectsAllocated() override REQUIRES_SHARED(Locks::mutator_lock_) 128*795d594fSAndroid Build Coastguard Worker REQUIRES(!*Locks::runtime_shutdown_lock_, !*Locks::thread_list_lock_, !lock_); 129*795d594fSAndroid Build Coastguard Worker // Return the pre-determined allocated object count. This could be beneficial 130*795d594fSAndroid Build Coastguard Worker // when we know that all the TLABs are revoked. GetAccumulatedObjectsAllocated()131*795d594fSAndroid Build Coastguard Worker int32_t GetAccumulatedObjectsAllocated() REQUIRES_SHARED(Locks::mutator_lock_) { 132*795d594fSAndroid Build Coastguard Worker return objects_allocated_.load(std::memory_order_relaxed); 133*795d594fSAndroid Build Coastguard Worker } IsEmpty()134*795d594fSAndroid Build Coastguard Worker bool IsEmpty() const { 135*795d594fSAndroid Build Coastguard Worker return Begin() == End(); 136*795d594fSAndroid Build Coastguard Worker } 137*795d594fSAndroid Build Coastguard Worker CanMoveObjects()138*795d594fSAndroid Build Coastguard Worker bool CanMoveObjects() const override { 139*795d594fSAndroid Build Coastguard Worker return true; 140*795d594fSAndroid Build Coastguard Worker } 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Worker // TODO: Change this? Mainly used for compacting to a particular region of memory. 143*795d594fSAndroid Build Coastguard Worker BumpPointerSpace(const std::string& name, uint8_t* begin, uint8_t* limit); 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker // Allocate a new TLAB and updates bytes_tl_bulk_allocated with the 146*795d594fSAndroid Build Coastguard Worker // allocation-size, returns false if the allocation failed. 147*795d594fSAndroid Build Coastguard Worker bool AllocNewTlab(Thread* self, size_t bytes, size_t* bytes_tl_bulk_allocated) REQUIRES(!lock_); 148*795d594fSAndroid Build Coastguard Worker AsBumpPointerSpace()149*795d594fSAndroid Build Coastguard Worker BumpPointerSpace* AsBumpPointerSpace() override { 150*795d594fSAndroid Build Coastguard Worker return this; 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker // Go through all of the blocks and visit the continuous objects. 154*795d594fSAndroid Build Coastguard Worker template <typename Visitor> 155*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void Walk(Visitor&& visitor) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!lock_); 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker accounting::ContinuousSpaceBitmap::SweepCallback* GetSweepCallback() override; 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker // Record objects / bytes freed. RecordFree(int32_t objects,int32_t bytes)160*795d594fSAndroid Build Coastguard Worker void RecordFree(int32_t objects, int32_t bytes) { 161*795d594fSAndroid Build Coastguard Worker objects_allocated_.fetch_sub(objects, std::memory_order_relaxed); 162*795d594fSAndroid Build Coastguard Worker bytes_allocated_.fetch_sub(bytes, std::memory_order_relaxed); 163*795d594fSAndroid Build Coastguard Worker } 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker bool LogFragmentationAllocFailure(std::ostream& os, size_t failed_alloc_bytes) override 166*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker // Object alignment within the space. 169*795d594fSAndroid Build Coastguard Worker static constexpr size_t kAlignment = kObjectAlignment; 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker protected: 172*795d594fSAndroid Build Coastguard Worker BumpPointerSpace(const std::string& name, MemMap&& mem_map); 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker // Allocate a raw block of bytes. 175*795d594fSAndroid Build Coastguard Worker uint8_t* AllocBlock(size_t bytes) REQUIRES(lock_); 176*795d594fSAndroid Build Coastguard Worker void RevokeThreadLocalBuffersLocked(Thread* thread) REQUIRES(lock_); 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker // The main block is an unbounded block where objects go when there are no other blocks. This 179*795d594fSAndroid Build Coastguard Worker // enables us to maintain tightly packed objects when you are not using thread local buffers for 180*795d594fSAndroid Build Coastguard Worker // allocation. The main block starts at the space Begin(). 181*795d594fSAndroid Build Coastguard Worker void UpdateMainBlock() REQUIRES(lock_); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker uint8_t* growth_end_; 184*795d594fSAndroid Build Coastguard Worker AtomicInteger objects_allocated_; // Accumulated from revoked thread local regions. 185*795d594fSAndroid Build Coastguard Worker AtomicInteger bytes_allocated_; // Accumulated from revoked thread local regions. 186*795d594fSAndroid Build Coastguard Worker Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 187*795d594fSAndroid Build Coastguard Worker // The objects at the start of the space are stored in the main block. 188*795d594fSAndroid Build Coastguard Worker size_t main_block_size_ GUARDED_BY(lock_); 189*795d594fSAndroid Build Coastguard Worker // List of block sizes (in bytes) after the main-block. Needed for Walk(). 190*795d594fSAndroid Build Coastguard Worker // If empty then the space has only one long continuous block. Each TLAB 191*795d594fSAndroid Build Coastguard Worker // allocation has one entry in this deque. 192*795d594fSAndroid Build Coastguard Worker // Keeping block-sizes off-heap simplifies sliding compaction algorithms. 193*795d594fSAndroid Build Coastguard Worker // The compaction algorithm should ideally compact all objects into the main 194*795d594fSAndroid Build Coastguard Worker // block, thereby enabling erasing corresponding entries from here. 195*795d594fSAndroid Build Coastguard Worker std::deque<size_t> block_sizes_ GUARDED_BY(lock_); 196*795d594fSAndroid Build Coastguard Worker // Size of the black-dense region that is to be walked using mark-bitmap and 197*795d594fSAndroid Build Coastguard Worker // not object-by-object. 198*795d594fSAndroid Build Coastguard Worker size_t black_dense_region_size_ GUARDED_BY(lock_) = 0; 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker private: 201*795d594fSAndroid Build Coastguard Worker // Return the object which comes after obj, while ensuring alignment. 202*795d594fSAndroid Build Coastguard Worker static mirror::Object* GetNextObject(mirror::Object* obj) 203*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker // Return a vector of block sizes on the space. Required by MarkCompact GC for 206*795d594fSAndroid Build Coastguard Worker // walking black objects allocated after marking phase. 207*795d594fSAndroid Build Coastguard Worker std::vector<size_t>* GetBlockSizes(Thread* self, size_t* main_block_size) REQUIRES(!lock_); 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker // Once the MarkCompact decides the post-compact layout of the space in the 210*795d594fSAndroid Build Coastguard Worker // pre-compaction pause, it calls this function to update the block sizes. It is 211*795d594fSAndroid Build Coastguard Worker // done by passing the new main-block size, which consumes a bunch of blocks 212*795d594fSAndroid Build Coastguard Worker // into itself, and the index of first unconsumed block. This works as all the 213*795d594fSAndroid Build Coastguard Worker // block sizes are ordered. Also updates 'end_' to reflect the change. 214*795d594fSAndroid Build Coastguard Worker void SetBlockSizes(Thread* self, const size_t main_block_size, const size_t first_valid_idx) 215*795d594fSAndroid Build Coastguard Worker REQUIRES(!lock_, Locks::mutator_lock_); 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker // Align end to the given alignment. This is done in MarkCompact GC when 218*795d594fSAndroid Build Coastguard Worker // mutators are suspended so that upcoming TLAB allocations start with a new 219*795d594fSAndroid Build Coastguard Worker // page. Adjust's heap's bytes_allocated accordingly. Returns the aligned end. 220*795d594fSAndroid Build Coastguard Worker uint8_t* AlignEnd(Thread* self, size_t alignment, Heap* heap) REQUIRES(Locks::mutator_lock_); 221*795d594fSAndroid Build Coastguard Worker // Called only by CMC GC at the end of GC. 222*795d594fSAndroid Build Coastguard Worker void SetBlackDenseRegionSize(size_t size) REQUIRES(!lock_); 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker friend class collector::MarkSweep; 225*795d594fSAndroid Build Coastguard Worker friend class collector::MarkCompact; 226*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(BumpPointerSpace); 227*795d594fSAndroid Build Coastguard Worker }; 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker } // namespace space 230*795d594fSAndroid Build Coastguard Worker } // namespace gc 231*795d594fSAndroid Build Coastguard Worker } // namespace art 232*795d594fSAndroid Build Coastguard Worker 233*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_GC_SPACE_BUMP_POINTER_SPACE_H_ 234