1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ART_RUNTIME_GC_HEAP_INL_H_ 18 #define ART_RUNTIME_GC_HEAP_INL_H_ 19 20 #include "heap.h" 21 22 #include "allocation_listener.h" 23 #include "base/quasi_atomic.h" 24 #include "base/time_utils.h" 25 #include "gc/accounting/atomic_stack.h" 26 #include "gc/accounting/card_table-inl.h" 27 #include "gc/allocation_record.h" 28 #include "gc/collector/semi_space.h" 29 #include "gc/space/bump_pointer_space-inl.h" 30 #include "gc/space/dlmalloc_space-inl.h" 31 #include "gc/space/large_object_space.h" 32 #include "gc/space/region_space-inl.h" 33 #include "gc/space/rosalloc_space-inl.h" 34 #include "handle_scope-inl.h" 35 #include "obj_ptr-inl.h" 36 #include "runtime.h" 37 #include "thread-inl.h" 38 #include "verify_object.h" 39 #include "write_barrier-inl.h" 40 41 namespace art { 42 namespace gc { 43 44 template <bool kInstrumented, bool kCheckLargeObject, typename PreFenceVisitor> 45 inline mirror::Object* Heap::AllocObjectWithAllocator(Thread* self, 46 ObjPtr<mirror::Class> klass, 47 size_t byte_count, 48 AllocatorType allocator, 49 const PreFenceVisitor& pre_fence_visitor) { 50 if (kIsDebugBuild) { 51 CheckPreconditionsForAllocObject(klass, byte_count); 52 // Since allocation can cause a GC which will need to SuspendAll, make sure all allocations are 53 // done in the runnable state where suspension is expected. 54 CHECK_EQ(self->GetState(), kRunnable); 55 self->AssertThreadSuspensionIsAllowable(); 56 self->AssertNoPendingException(); 57 // Make sure to preserve klass. 58 StackHandleScope<1> hs(self); 59 HandleWrapperObjPtr<mirror::Class> h = hs.NewHandleWrapper(&klass); 60 self->PoisonObjectPointers(); 61 } 62 // Need to check that we aren't the large object allocator since the large object allocation code 63 // path includes this function. If we didn't check we would have an infinite loop. 64 ObjPtr<mirror::Object> obj; 65 if (kCheckLargeObject && UNLIKELY(ShouldAllocLargeObject(klass, byte_count))) { 66 obj = AllocLargeObject<kInstrumented, PreFenceVisitor>(self, &klass, byte_count, 67 pre_fence_visitor); 68 if (obj != nullptr) { 69 return obj.Ptr(); 70 } else { 71 // There should be an OOM exception, since we are retrying, clear it. 72 self->ClearException(); 73 } 74 // If the large object allocation failed, try to use the normal spaces (main space, 75 // non moving space). This can happen if there is significant virtual address space 76 // fragmentation. 77 } 78 // bytes allocated for the (individual) object. 79 size_t bytes_allocated; 80 size_t usable_size; 81 size_t new_num_bytes_allocated = 0; 82 if (IsTLABAllocator(allocator)) { 83 byte_count = RoundUp(byte_count, space::BumpPointerSpace::kAlignment); 84 } 85 // If we have a thread local allocation we don't need to update bytes allocated. 86 if (IsTLABAllocator(allocator) && byte_count <= self->TlabSize()) { 87 obj = self->AllocTlab(byte_count); 88 DCHECK(obj != nullptr) << "AllocTlab can't fail"; 89 obj->SetClass(klass); 90 if (kUseBakerReadBarrier) { 91 obj->AssertReadBarrierState(); 92 } 93 bytes_allocated = byte_count; 94 usable_size = bytes_allocated; 95 pre_fence_visitor(obj, usable_size); 96 QuasiAtomic::ThreadFenceForConstructor(); 97 } else if ( 98 !kInstrumented && allocator == kAllocatorTypeRosAlloc && 99 (obj = rosalloc_space_->AllocThreadLocal(self, byte_count, &bytes_allocated)) != nullptr && 100 LIKELY(obj != nullptr)) { 101 DCHECK(!is_running_on_memory_tool_); 102 obj->SetClass(klass); 103 if (kUseBakerReadBarrier) { 104 obj->AssertReadBarrierState(); 105 } 106 usable_size = bytes_allocated; 107 pre_fence_visitor(obj, usable_size); 108 QuasiAtomic::ThreadFenceForConstructor(); 109 } else { 110 // Bytes allocated that includes bulk thread-local buffer allocations in addition to direct 111 // non-TLAB object allocations. 112 size_t bytes_tl_bulk_allocated = 0u; 113 obj = TryToAllocate<kInstrumented, false>(self, allocator, byte_count, &bytes_allocated, 114 &usable_size, &bytes_tl_bulk_allocated); 115 if (UNLIKELY(obj == nullptr)) { 116 // AllocateInternalWithGc can cause thread suspension, if someone instruments the entrypoints 117 // or changes the allocator in a suspend point here, we need to retry the allocation. 118 obj = AllocateInternalWithGc(self, 119 allocator, 120 kInstrumented, 121 byte_count, 122 &bytes_allocated, 123 &usable_size, 124 &bytes_tl_bulk_allocated, &klass); 125 if (obj == nullptr) { 126 // The only way that we can get a null return if there is no pending exception is if the 127 // allocator or instrumentation changed. 128 if (!self->IsExceptionPending()) { 129 // AllocObject will pick up the new allocator type, and instrumented as true is the safe 130 // default. 131 return AllocObject</*kInstrumented=*/true>(self, 132 klass, 133 byte_count, 134 pre_fence_visitor); 135 } 136 return nullptr; 137 } 138 } 139 DCHECK_GT(bytes_allocated, 0u); 140 DCHECK_GT(usable_size, 0u); 141 obj->SetClass(klass); 142 if (kUseBakerReadBarrier) { 143 obj->AssertReadBarrierState(); 144 } 145 if (collector::SemiSpace::kUseRememberedSet && UNLIKELY(allocator == kAllocatorTypeNonMoving)) { 146 // (Note this if statement will be constant folded away for the 147 // fast-path quick entry points.) Because SetClass() has no write 148 // barrier, if a non-moving space allocation, we need a write 149 // barrier as the class pointer may point to the bump pointer 150 // space (where the class pointer is an "old-to-young" reference, 151 // though rare) under the GSS collector with the remembered set 152 // enabled. We don't need this for kAllocatorTypeRosAlloc/DlMalloc 153 // cases because we don't directly allocate into the main alloc 154 // space (besides promotions) under the SS/GSS collector. 155 WriteBarrier::ForFieldWrite(obj, mirror::Object::ClassOffset(), klass); 156 } 157 pre_fence_visitor(obj, usable_size); 158 QuasiAtomic::ThreadFenceForConstructor(); 159 if (bytes_tl_bulk_allocated > 0) { 160 size_t num_bytes_allocated_before = 161 num_bytes_allocated_.fetch_add(bytes_tl_bulk_allocated, std::memory_order_relaxed); 162 new_num_bytes_allocated = num_bytes_allocated_before + bytes_tl_bulk_allocated; 163 // Only trace when we get an increase in the number of bytes allocated. This happens when 164 // obtaining a new TLAB and isn't often enough to hurt performance according to golem. 165 TraceHeapSize(new_num_bytes_allocated); 166 } 167 } 168 if (kIsDebugBuild && Runtime::Current()->IsStarted()) { 169 CHECK_LE(obj->SizeOf(), usable_size); 170 } 171 // TODO: Deprecate. 172 if (kInstrumented) { 173 if (Runtime::Current()->HasStatsEnabled()) { 174 RuntimeStats* thread_stats = self->GetStats(); 175 ++thread_stats->allocated_objects; 176 thread_stats->allocated_bytes += bytes_allocated; 177 RuntimeStats* global_stats = Runtime::Current()->GetStats(); 178 ++global_stats->allocated_objects; 179 global_stats->allocated_bytes += bytes_allocated; 180 } 181 } else { 182 DCHECK(!Runtime::Current()->HasStatsEnabled()); 183 } 184 if (kInstrumented) { 185 if (IsAllocTrackingEnabled()) { 186 // allocation_records_ is not null since it never becomes null after allocation tracking is 187 // enabled. 188 DCHECK(allocation_records_ != nullptr); 189 allocation_records_->RecordAllocation(self, &obj, bytes_allocated); 190 } 191 AllocationListener* l = alloc_listener_.load(std::memory_order_seq_cst); 192 if (l != nullptr) { 193 // Same as above. We assume that a listener that was once stored will never be deleted. 194 // Otherwise we'd have to perform this under a lock. 195 l->ObjectAllocated(self, &obj, bytes_allocated); 196 } 197 } else { 198 DCHECK(!IsAllocTrackingEnabled()); 199 } 200 if (AllocatorHasAllocationStack(allocator)) { 201 PushOnAllocationStack(self, &obj); 202 } 203 if (kInstrumented) { 204 if (gc_stress_mode_) { 205 CheckGcStressMode(self, &obj); 206 } 207 } else { 208 DCHECK(!gc_stress_mode_); 209 } 210 // IsGcConcurrent() isn't known at compile time so we can optimize by not checking it for 211 // the BumpPointer or TLAB allocators. This is nice since it allows the entire if statement to be 212 // optimized out. And for the other allocators, AllocatorMayHaveConcurrentGC is a constant since 213 // the allocator_type should be constant propagated. 214 if (AllocatorMayHaveConcurrentGC(allocator) && IsGcConcurrent()) { 215 // New_num_bytes_allocated is zero if we didn't update num_bytes_allocated_. 216 // That's fine. 217 CheckConcurrentGCForJava(self, new_num_bytes_allocated, &obj); 218 } 219 VerifyObject(obj); 220 self->VerifyStack(); 221 return obj.Ptr(); 222 } 223 224 // The size of a thread-local allocation stack in the number of references. 225 static constexpr size_t kThreadLocalAllocationStackSize = 128; 226 227 inline void Heap::PushOnAllocationStack(Thread* self, ObjPtr<mirror::Object>* obj) { 228 if (kUseThreadLocalAllocationStack) { 229 if (UNLIKELY(!self->PushOnThreadLocalAllocationStack(obj->Ptr()))) { 230 PushOnThreadLocalAllocationStackWithInternalGC(self, obj); 231 } 232 } else if (UNLIKELY(!allocation_stack_->AtomicPushBack(obj->Ptr()))) { 233 PushOnAllocationStackWithInternalGC(self, obj); 234 } 235 } 236 237 template <bool kInstrumented, typename PreFenceVisitor> 238 inline mirror::Object* Heap::AllocLargeObject(Thread* self, 239 ObjPtr<mirror::Class>* klass, 240 size_t byte_count, 241 const PreFenceVisitor& pre_fence_visitor) { 242 // Save and restore the class in case it moves. 243 StackHandleScope<1> hs(self); 244 auto klass_wrapper = hs.NewHandleWrapper(klass); 245 return AllocObjectWithAllocator<kInstrumented, false, PreFenceVisitor>(self, *klass, byte_count, 246 kAllocatorTypeLOS, 247 pre_fence_visitor); 248 } 249 250 template <const bool kInstrumented, const bool kGrow> 251 inline mirror::Object* Heap::TryToAllocate(Thread* self, 252 AllocatorType allocator_type, 253 size_t alloc_size, 254 size_t* bytes_allocated, 255 size_t* usable_size, 256 size_t* bytes_tl_bulk_allocated) { 257 if (allocator_type != kAllocatorTypeRegionTLAB && 258 allocator_type != kAllocatorTypeTLAB && 259 allocator_type != kAllocatorTypeRosAlloc && 260 UNLIKELY(IsOutOfMemoryOnAllocation(allocator_type, alloc_size, kGrow))) { 261 return nullptr; 262 } 263 mirror::Object* ret; 264 switch (allocator_type) { 265 case kAllocatorTypeBumpPointer: { 266 DCHECK(bump_pointer_space_ != nullptr); 267 alloc_size = RoundUp(alloc_size, space::BumpPointerSpace::kAlignment); 268 ret = bump_pointer_space_->AllocNonvirtual(alloc_size); 269 if (LIKELY(ret != nullptr)) { 270 *bytes_allocated = alloc_size; 271 *usable_size = alloc_size; 272 *bytes_tl_bulk_allocated = alloc_size; 273 } 274 break; 275 } 276 case kAllocatorTypeRosAlloc: { 277 if (kInstrumented && UNLIKELY(is_running_on_memory_tool_)) { 278 // If running on ASan, we should be using the instrumented path. 279 size_t max_bytes_tl_bulk_allocated = rosalloc_space_->MaxBytesBulkAllocatedFor(alloc_size); 280 if (UNLIKELY(IsOutOfMemoryOnAllocation(allocator_type, 281 max_bytes_tl_bulk_allocated, 282 kGrow))) { 283 return nullptr; 284 } 285 ret = rosalloc_space_->Alloc(self, alloc_size, bytes_allocated, usable_size, 286 bytes_tl_bulk_allocated); 287 } else { 288 DCHECK(!is_running_on_memory_tool_); 289 size_t max_bytes_tl_bulk_allocated = 290 rosalloc_space_->MaxBytesBulkAllocatedForNonvirtual(alloc_size); 291 if (UNLIKELY(IsOutOfMemoryOnAllocation(allocator_type, 292 max_bytes_tl_bulk_allocated, 293 kGrow))) { 294 return nullptr; 295 } 296 if (!kInstrumented) { 297 DCHECK(!rosalloc_space_->CanAllocThreadLocal(self, alloc_size)); 298 } 299 ret = rosalloc_space_->AllocNonvirtual(self, 300 alloc_size, 301 bytes_allocated, 302 usable_size, 303 bytes_tl_bulk_allocated); 304 } 305 break; 306 } 307 case kAllocatorTypeDlMalloc: { 308 if (kInstrumented && UNLIKELY(is_running_on_memory_tool_)) { 309 // If running on ASan, we should be using the instrumented path. 310 ret = dlmalloc_space_->Alloc(self, 311 alloc_size, 312 bytes_allocated, 313 usable_size, 314 bytes_tl_bulk_allocated); 315 } else { 316 DCHECK(!is_running_on_memory_tool_); 317 ret = dlmalloc_space_->AllocNonvirtual(self, 318 alloc_size, 319 bytes_allocated, 320 usable_size, 321 bytes_tl_bulk_allocated); 322 } 323 break; 324 } 325 case kAllocatorTypeNonMoving: { 326 ret = non_moving_space_->Alloc(self, 327 alloc_size, 328 bytes_allocated, 329 usable_size, 330 bytes_tl_bulk_allocated); 331 break; 332 } 333 case kAllocatorTypeLOS: { 334 ret = large_object_space_->Alloc(self, 335 alloc_size, 336 bytes_allocated, 337 usable_size, 338 bytes_tl_bulk_allocated); 339 // Note that the bump pointer spaces aren't necessarily next to 340 // the other continuous spaces like the non-moving alloc space or 341 // the zygote space. 342 DCHECK(ret == nullptr || large_object_space_->Contains(ret)); 343 break; 344 } 345 case kAllocatorTypeRegion: { 346 DCHECK(region_space_ != nullptr); 347 alloc_size = RoundUp(alloc_size, space::RegionSpace::kAlignment); 348 ret = region_space_->AllocNonvirtual<false>(alloc_size, 349 bytes_allocated, 350 usable_size, 351 bytes_tl_bulk_allocated); 352 break; 353 } 354 case kAllocatorTypeTLAB: 355 FALLTHROUGH_INTENDED; 356 case kAllocatorTypeRegionTLAB: { 357 DCHECK_ALIGNED(alloc_size, kObjectAlignment); 358 static_assert(space::RegionSpace::kAlignment == space::BumpPointerSpace::kAlignment, 359 "mismatched alignments"); 360 static_assert(kObjectAlignment == space::BumpPointerSpace::kAlignment, 361 "mismatched alignments"); 362 if (UNLIKELY(self->TlabSize() < alloc_size)) { 363 // kAllocatorTypeTLAB may be the allocator for region space TLAB if the GC is not marking, 364 // that is why the allocator is not passed down. 365 return AllocWithNewTLAB(self, 366 alloc_size, 367 kGrow, 368 bytes_allocated, 369 usable_size, 370 bytes_tl_bulk_allocated); 371 } 372 // The allocation can't fail. 373 ret = self->AllocTlab(alloc_size); 374 DCHECK(ret != nullptr); 375 *bytes_allocated = alloc_size; 376 *bytes_tl_bulk_allocated = 0; // Allocated in an existing buffer. 377 *usable_size = alloc_size; 378 break; 379 } 380 default: { 381 LOG(FATAL) << "Invalid allocator type"; 382 ret = nullptr; 383 } 384 } 385 return ret; 386 } 387 388 inline bool Heap::ShouldAllocLargeObject(ObjPtr<mirror::Class> c, size_t byte_count) const { 389 // We need to have a zygote space or else our newly allocated large object can end up in the 390 // Zygote resulting in it being prematurely freed. 391 // We can only do this for primitive objects since large objects will not be within the card table 392 // range. This also means that we rely on SetClass not dirtying the object's card. 393 return byte_count >= large_object_threshold_ && (c->IsPrimitiveArray() || c->IsStringClass()); 394 } 395 396 inline bool Heap::IsOutOfMemoryOnAllocation(AllocatorType allocator_type, 397 size_t alloc_size, 398 bool grow) { 399 size_t old_target = target_footprint_.load(std::memory_order_relaxed); 400 while (true) { 401 size_t old_allocated = num_bytes_allocated_.load(std::memory_order_relaxed); 402 size_t new_footprint = old_allocated + alloc_size; 403 // Tests against heap limits are inherently approximate, since multiple allocations may 404 // race, and this is not atomic with the allocation. 405 if (UNLIKELY(new_footprint <= old_target)) { 406 return false; 407 } else if (UNLIKELY(new_footprint > growth_limit_)) { 408 return true; 409 } 410 // We are between target_footprint_ and growth_limit_ . 411 if (AllocatorMayHaveConcurrentGC(allocator_type) && IsGcConcurrent()) { 412 return false; 413 } else { 414 if (grow) { 415 if (target_footprint_.compare_exchange_weak(/*inout ref*/old_target, new_footprint, 416 std::memory_order_relaxed)) { 417 VlogHeapGrowth(old_target, new_footprint, alloc_size); 418 return false; 419 } // else try again. 420 } else { 421 return true; 422 } 423 } 424 } 425 } 426 427 inline bool Heap::ShouldConcurrentGCForJava(size_t new_num_bytes_allocated) { 428 // For a Java allocation, we only check whether the number of Java allocated bytes excceeds a 429 // threshold. By not considering native allocation here, we (a) ensure that Java heap bounds are 430 // maintained, and (b) reduce the cost of the check here. 431 return new_num_bytes_allocated >= concurrent_start_bytes_; 432 } 433 434 inline void Heap::CheckConcurrentGCForJava(Thread* self, 435 size_t new_num_bytes_allocated, 436 ObjPtr<mirror::Object>* obj) { 437 if (UNLIKELY(ShouldConcurrentGCForJava(new_num_bytes_allocated))) { 438 RequestConcurrentGCAndSaveObject(self, false /* force_full */, obj); 439 } 440 } 441 442 } // namespace gc 443 } // namespace art 444 445 #endif // ART_RUNTIME_GC_HEAP_INL_H_ 446