1 /* 2 * Copyright (C) 2008 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_H_ 18 #define ART_RUNTIME_GC_HEAP_H_ 19 20 #include <iosfwd> 21 #include <string> 22 #include <vector> 23 24 #include "atomic_integer.h" 25 #include "base/timing_logger.h" 26 #include "gc/accounting/atomic_stack.h" 27 #include "gc/accounting/card_table.h" 28 #include "gc/collector/gc_type.h" 29 #include "globals.h" 30 #include "gtest/gtest.h" 31 #include "jni.h" 32 #include "locks.h" 33 #include "offsets.h" 34 #include "safe_map.h" 35 #include "thread_pool.h" 36 37 namespace art { 38 39 class ConditionVariable; 40 class Mutex; 41 class StackVisitor; 42 class Thread; 43 class TimingLogger; 44 45 namespace mirror { 46 class Class; 47 class Object; 48 } // namespace mirror 49 50 namespace gc { 51 namespace accounting { 52 class HeapBitmap; 53 class ModUnionTable; 54 class SpaceSetMap; 55 } // namespace accounting 56 57 namespace collector { 58 class GarbageCollector; 59 class MarkSweep; 60 } // namespace collector 61 62 namespace space { 63 class AllocSpace; 64 class DiscontinuousSpace; 65 class DlMallocSpace; 66 class ImageSpace; 67 class LargeObjectSpace; 68 class Space; 69 class SpaceTest; 70 } // namespace space 71 72 class AgeCardVisitor { 73 public: operator()74 byte operator()(byte card) const { 75 if (card == accounting::CardTable::kCardDirty) { 76 return card - 1; 77 } else { 78 return 0; 79 } 80 } 81 }; 82 83 // What caused the GC? 84 enum GcCause { 85 // GC triggered by a failed allocation. Thread doing allocation is blocked waiting for GC before 86 // retrying allocation. 87 kGcCauseForAlloc, 88 // A background GC trying to ensure there is free memory ahead of allocations. 89 kGcCauseBackground, 90 // An explicit System.gc() call. 91 kGcCauseExplicit, 92 }; 93 std::ostream& operator<<(std::ostream& os, const GcCause& policy); 94 95 // How we want to sanity check the heap's correctness. 96 enum HeapVerificationMode { 97 kHeapVerificationNotPermitted, // Too early in runtime start-up for heap to be verified. 98 kNoHeapVerification, // Production default. 99 kVerifyAllFast, // Sanity check all heap accesses with quick(er) tests. 100 kVerifyAll // Sanity check all heap accesses. 101 }; 102 static constexpr HeapVerificationMode kDesiredHeapVerification = kNoHeapVerification; 103 104 class Heap { 105 public: 106 static constexpr size_t kDefaultInitialSize = 2 * MB; 107 static constexpr size_t kDefaultMaximumSize = 32 * MB; 108 static constexpr size_t kDefaultMaxFree = 2 * MB; 109 static constexpr size_t kDefaultMinFree = kDefaultMaxFree / 4; 110 static constexpr size_t kDefaultLongPauseLogThreshold = MsToNs(5); 111 static constexpr size_t kDefaultLongGCLogThreshold = MsToNs(100); 112 113 // Default target utilization. 114 static constexpr double kDefaultTargetUtilization = 0.5; 115 116 // Used so that we don't overflow the allocation time atomic integer. 117 static constexpr size_t kTimeAdjust = 1024; 118 119 // Create a heap with the requested sizes. The possible empty 120 // image_file_names names specify Spaces to load based on 121 // ImageWriter output. 122 explicit Heap(size_t initial_size, size_t growth_limit, size_t min_free, 123 size_t max_free, double target_utilization, size_t capacity, 124 const std::string& original_image_file_name, bool concurrent_gc, 125 size_t parallel_gc_threads, size_t conc_gc_threads, bool low_memory_mode, 126 size_t long_pause_threshold, size_t long_gc_threshold, bool ignore_max_footprint); 127 128 ~Heap(); 129 130 // Allocates and initializes storage for an object instance. 131 mirror::Object* AllocObject(Thread* self, mirror::Class* klass, size_t num_bytes) 132 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 133 134 void RegisterNativeAllocation(int bytes) 135 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 136 void RegisterNativeFree(int bytes) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 137 138 // The given reference is believed to be to an object in the Java heap, check the soundness of it. 139 void VerifyObjectImpl(const mirror::Object* o); VerifyObject(const mirror::Object * o)140 void VerifyObject(const mirror::Object* o) { 141 if (o != NULL && this != NULL && verify_object_mode_ > kNoHeapVerification) { 142 VerifyObjectImpl(o); 143 } 144 } 145 146 // Check sanity of all live references. 147 void VerifyHeap() LOCKS_EXCLUDED(Locks::heap_bitmap_lock_); 148 bool VerifyHeapReferences() 149 EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) 150 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 151 bool VerifyMissingCardMarks() 152 EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) 153 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 154 155 // A weaker test than IsLiveObject or VerifyObject that doesn't require the heap lock, 156 // and doesn't abort on error, allowing the caller to report more 157 // meaningful diagnostics. 158 bool IsHeapAddress(const mirror::Object* obj); 159 160 // Returns true if 'obj' is a live heap object, false otherwise (including for invalid addresses). 161 // Requires the heap lock to be held. 162 bool IsLiveObjectLocked(const mirror::Object* obj, bool search_allocation_stack = true, 163 bool search_live_stack = true, bool sorted = false) 164 SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 165 166 // Initiates an explicit garbage collection. 167 void CollectGarbage(bool clear_soft_references) LOCKS_EXCLUDED(Locks::mutator_lock_); 168 169 // Does a concurrent GC, should only be called by the GC daemon thread 170 // through runtime. 171 void ConcurrentGC(Thread* self) LOCKS_EXCLUDED(Locks::runtime_shutdown_lock_); 172 173 // Implements VMDebug.countInstancesOfClass and JDWP VM_InstanceCount. 174 // The boolean decides whether to use IsAssignableFrom or == when comparing classes. 175 void CountInstances(const std::vector<mirror::Class*>& classes, bool use_is_assignable_from, 176 uint64_t* counts) 177 LOCKS_EXCLUDED(Locks::heap_bitmap_lock_) 178 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 179 // Implements JDWP RT_Instances. 180 void GetInstances(mirror::Class* c, int32_t max_count, std::vector<mirror::Object*>& instances) 181 LOCKS_EXCLUDED(Locks::heap_bitmap_lock_) 182 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 183 // Implements JDWP OR_ReferringObjects. 184 void GetReferringObjects(mirror::Object* o, int32_t max_count, std::vector<mirror::Object*>& referring_objects) 185 LOCKS_EXCLUDED(Locks::heap_bitmap_lock_) 186 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 187 188 // Removes the growth limit on the alloc space so it may grow to its maximum capacity. Used to 189 // implement dalvik.system.VMRuntime.clearGrowthLimit. 190 void ClearGrowthLimit(); 191 192 // Target ideal heap utilization ratio, implements 193 // dalvik.system.VMRuntime.getTargetHeapUtilization. GetTargetHeapUtilization()194 double GetTargetHeapUtilization() const { 195 return target_utilization_; 196 } 197 198 // Data structure memory usage tracking. 199 void RegisterGCAllocation(size_t bytes); 200 void RegisterGCDeAllocation(size_t bytes); 201 202 // Set target ideal heap utilization ratio, implements 203 // dalvik.system.VMRuntime.setTargetHeapUtilization. 204 void SetTargetHeapUtilization(float target); 205 206 // For the alloc space, sets the maximum number of bytes that the heap is allowed to allocate 207 // from the system. Doesn't allow the space to exceed its growth limit. 208 void SetIdealFootprint(size_t max_allowed_footprint); 209 210 // Blocks the caller until the garbage collector becomes idle and returns 211 // true if we waited for the GC to complete. 212 collector::GcType WaitForConcurrentGcToComplete(Thread* self) LOCKS_EXCLUDED(gc_complete_lock_); 213 GetContinuousSpaces()214 const std::vector<space::ContinuousSpace*>& GetContinuousSpaces() const { 215 return continuous_spaces_; 216 } 217 GetDiscontinuousSpaces()218 const std::vector<space::DiscontinuousSpace*>& GetDiscontinuousSpaces() const { 219 return discontinuous_spaces_; 220 } 221 222 void SetReferenceOffsets(MemberOffset reference_referent_offset, 223 MemberOffset reference_queue_offset, 224 MemberOffset reference_queueNext_offset, 225 MemberOffset reference_pendingNext_offset, 226 MemberOffset finalizer_reference_zombie_offset); 227 228 mirror::Object* GetReferenceReferent(mirror::Object* reference); 229 void ClearReferenceReferent(mirror::Object* reference) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 230 231 // Returns true if the reference object has not yet been enqueued. 232 bool IsEnqueuable(const mirror::Object* ref); 233 void EnqueueReference(mirror::Object* ref, mirror::Object** list) 234 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 235 bool IsEnqueued(mirror::Object* ref) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 236 void EnqueuePendingReference(mirror::Object* ref, mirror::Object** list) 237 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 238 mirror::Object* DequeuePendingReference(mirror::Object** list) 239 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 240 GetReferencePendingNextOffset()241 MemberOffset GetReferencePendingNextOffset() { 242 DCHECK_NE(reference_pendingNext_offset_.Uint32Value(), 0U); 243 return reference_pendingNext_offset_; 244 } 245 GetFinalizerReferenceZombieOffset()246 MemberOffset GetFinalizerReferenceZombieOffset() { 247 DCHECK_NE(finalizer_reference_zombie_offset_.Uint32Value(), 0U); 248 return finalizer_reference_zombie_offset_; 249 } 250 251 // Enable verification of object references when the runtime is sufficiently initialized. EnableObjectValidation()252 void EnableObjectValidation() { 253 verify_object_mode_ = kDesiredHeapVerification; 254 if (verify_object_mode_ > kNoHeapVerification) { 255 VerifyHeap(); 256 } 257 } 258 259 // Disable object reference verification for image writing. DisableObjectValidation()260 void DisableObjectValidation() { 261 verify_object_mode_ = kHeapVerificationNotPermitted; 262 } 263 264 // Other checks may be performed if we know the heap should be in a sane state. IsObjectValidationEnabled()265 bool IsObjectValidationEnabled() const { 266 return kDesiredHeapVerification > kNoHeapVerification && 267 verify_object_mode_ > kHeapVerificationNotPermitted; 268 } 269 270 // Returns true if low memory mode is enabled. IsLowMemoryMode()271 bool IsLowMemoryMode() const { 272 return low_memory_mode_; 273 } 274 275 void RecordFree(size_t freed_objects, size_t freed_bytes); 276 277 // Must be called if a field of an Object in the heap changes, and before any GC safe-point. 278 // The call is not needed if NULL is stored in the field. WriteBarrierField(const mirror::Object * dst,MemberOffset,const mirror::Object *)279 void WriteBarrierField(const mirror::Object* dst, MemberOffset /*offset*/, const mirror::Object* /*new_value*/) { 280 card_table_->MarkCard(dst); 281 } 282 283 // Write barrier for array operations that update many field positions WriteBarrierArray(const mirror::Object * dst,int,size_t)284 void WriteBarrierArray(const mirror::Object* dst, int /*start_offset*/, 285 size_t /*length TODO: element_count or byte_count?*/) { 286 card_table_->MarkCard(dst); 287 } 288 GetCardTable()289 accounting::CardTable* GetCardTable() const { 290 return card_table_.get(); 291 } 292 293 void AddFinalizerReference(Thread* self, mirror::Object* object); 294 295 // Returns the number of bytes currently allocated. GetBytesAllocated()296 size_t GetBytesAllocated() const { 297 return num_bytes_allocated_; 298 } 299 300 // Returns the number of objects currently allocated. 301 size_t GetObjectsAllocated() const; 302 303 // Returns the total number of objects allocated since the heap was created. 304 size_t GetObjectsAllocatedEver() const; 305 306 // Returns the total number of bytes allocated since the heap was created. 307 size_t GetBytesAllocatedEver() const; 308 309 // Returns the total number of objects freed since the heap was created. GetObjectsFreedEver()310 size_t GetObjectsFreedEver() const { 311 return total_objects_freed_ever_; 312 } 313 314 // Returns the total number of bytes freed since the heap was created. GetBytesFreedEver()315 size_t GetBytesFreedEver() const { 316 return total_bytes_freed_ever_; 317 } 318 319 // Implements java.lang.Runtime.maxMemory, returning the maximum amount of memory a program can 320 // consume. For a regular VM this would relate to the -Xmx option and would return -1 if no Xmx 321 // were specified. Android apps start with a growth limit (small heap size) which is 322 // cleared/extended for large apps. GetMaxMemory()323 int64_t GetMaxMemory() const { 324 return growth_limit_; 325 } 326 327 // Implements java.lang.Runtime.totalMemory, returning the amount of memory consumed by an 328 // application. 329 int64_t GetTotalMemory() const; 330 331 // Implements java.lang.Runtime.freeMemory. GetFreeMemory()332 int64_t GetFreeMemory() const { 333 return GetTotalMemory() - num_bytes_allocated_; 334 } 335 336 // Get the space that corresponds to an object's address. Current implementation searches all 337 // spaces in turn. If fail_ok is false then failing to find a space will cause an abort. 338 // TODO: consider using faster data structure like binary tree. 339 space::ContinuousSpace* FindContinuousSpaceFromObject(const mirror::Object*, bool fail_ok) const; 340 space::DiscontinuousSpace* FindDiscontinuousSpaceFromObject(const mirror::Object*, 341 bool fail_ok) const; 342 space::Space* FindSpaceFromObject(const mirror::Object*, bool fail_ok) const; 343 344 void DumpForSigQuit(std::ostream& os); 345 346 size_t Trim(); 347 GetLiveBitmap()348 accounting::HeapBitmap* GetLiveBitmap() SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) { 349 return live_bitmap_.get(); 350 } 351 GetMarkBitmap()352 accounting::HeapBitmap* GetMarkBitmap() SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) { 353 return mark_bitmap_.get(); 354 } 355 GetLiveStack()356 accounting::ObjectStack* GetLiveStack() SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) { 357 return live_stack_.get(); 358 } 359 360 void PreZygoteFork() LOCKS_EXCLUDED(Locks::heap_bitmap_lock_); 361 362 // Mark and empty stack. 363 void FlushAllocStack() 364 EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 365 366 // Mark all the objects in the allocation stack in the specified bitmap. 367 void MarkAllocStack(accounting::SpaceBitmap* bitmap, accounting::SpaceSetMap* large_objects, 368 accounting::ObjectStack* stack) 369 EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 370 371 // Update and mark mod union table based on gc type. 372 void UpdateAndMarkModUnion(collector::MarkSweep* mark_sweep, base::TimingLogger& timings, 373 collector::GcType gc_type) 374 EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 375 376 // Gets called when we get notified by ActivityThread that the process state has changed. 377 void ListenForProcessStateChange(); 378 379 // DEPRECATED: Should remove in "near" future when support for multiple image spaces is added. 380 // Assumes there is only one image space. 381 space::ImageSpace* GetImageSpace() const; 382 GetAllocSpace()383 space::DlMallocSpace* GetAllocSpace() const { 384 return alloc_space_; 385 } 386 GetLargeObjectsSpace()387 space::LargeObjectSpace* GetLargeObjectsSpace() const { 388 return large_object_space_; 389 } 390 GetSoftRefQueueLock()391 Mutex* GetSoftRefQueueLock() { 392 return soft_ref_queue_lock_; 393 } 394 GetWeakRefQueueLock()395 Mutex* GetWeakRefQueueLock() { 396 return weak_ref_queue_lock_; 397 } 398 GetFinalizerRefQueueLock()399 Mutex* GetFinalizerRefQueueLock() { 400 return finalizer_ref_queue_lock_; 401 } 402 GetPhantomRefQueueLock()403 Mutex* GetPhantomRefQueueLock() { 404 return phantom_ref_queue_lock_; 405 } 406 407 void DumpSpaces(); 408 409 // GC performance measuring 410 void DumpGcPerformanceInfo(std::ostream& os); 411 412 // Returns true if we currently care about pause times. CareAboutPauseTimes()413 bool CareAboutPauseTimes() const { 414 return care_about_pause_times_; 415 } 416 417 // Thread pool. 418 void CreateThreadPool(); 419 void DeleteThreadPool(); GetThreadPool()420 ThreadPool* GetThreadPool() { 421 return thread_pool_.get(); 422 } GetParallelGCThreadCount()423 size_t GetParallelGCThreadCount() const { 424 return parallel_gc_threads_; 425 } GetConcGCThreadCount()426 size_t GetConcGCThreadCount() const { 427 return conc_gc_threads_; 428 } 429 430 private: 431 // Allocates uninitialized storage. Passing in a null space tries to place the object in the 432 // large object space. 433 template <class T> mirror::Object* Allocate(Thread* self, T* space, size_t num_bytes, size_t* bytes_allocated) 434 LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_) 435 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 436 437 // Handles Allocate()'s slow allocation path with GC involved after 438 // an initial allocation attempt failed. 439 mirror::Object* AllocateInternalWithGc(Thread* self, space::AllocSpace* space, size_t num_bytes, 440 size_t* bytes_allocated) 441 LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_) 442 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 443 444 // Try to allocate a number of bytes, this function never does any GCs. 445 mirror::Object* TryToAllocate(Thread* self, space::AllocSpace* space, size_t alloc_size, bool grow, 446 size_t* bytes_allocated) 447 LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_) 448 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 449 450 // Try to allocate a number of bytes, this function never does any GCs. DlMallocSpace-specialized version. 451 mirror::Object* TryToAllocate(Thread* self, space::DlMallocSpace* space, size_t alloc_size, bool grow, 452 size_t* bytes_allocated) 453 LOCKS_EXCLUDED(Locks::thread_suspend_count_lock_) 454 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 455 456 bool IsOutOfMemoryOnAllocation(size_t alloc_size, bool grow); 457 458 // Pushes a list of cleared references out to the managed heap. 459 void EnqueueClearedReferences(mirror::Object** cleared_references); 460 461 void RequestHeapTrim() LOCKS_EXCLUDED(Locks::runtime_shutdown_lock_); 462 void RequestConcurrentGC(Thread* self) LOCKS_EXCLUDED(Locks::runtime_shutdown_lock_); 463 bool IsGCRequestPending() const; 464 465 void RecordAllocation(size_t size, mirror::Object* object) 466 LOCKS_EXCLUDED(GlobalSynchronization::heap_bitmap_lock_) 467 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 468 469 // Sometimes CollectGarbageInternal decides to run a different Gc than you requested. Returns 470 // which type of Gc was actually ran. 471 collector::GcType CollectGarbageInternal(collector::GcType gc_plan, GcCause gc_cause, 472 bool clear_soft_references) 473 LOCKS_EXCLUDED(gc_complete_lock_, 474 Locks::heap_bitmap_lock_, 475 Locks::thread_suspend_count_lock_); 476 477 void PreGcVerification(collector::GarbageCollector* gc); 478 void PreSweepingGcVerification(collector::GarbageCollector* gc) 479 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 480 void PostGcVerification(collector::GarbageCollector* gc); 481 482 // Update the watermark for the native allocated bytes based on the current number of native 483 // bytes allocated and the target utilization ratio. 484 void UpdateMaxNativeFootprint(); 485 486 // Given the current contents of the alloc space, increase the allowed heap footprint to match 487 // the target utilization ratio. This should only be called immediately after a full garbage 488 // collection. 489 void GrowForUtilization(collector::GcType gc_type, uint64_t gc_duration); 490 491 size_t GetPercentFree(); 492 493 void AddContinuousSpace(space::ContinuousSpace* space) LOCKS_EXCLUDED(Locks::heap_bitmap_lock_); 494 void AddDiscontinuousSpace(space::DiscontinuousSpace* space) 495 LOCKS_EXCLUDED(Locks::heap_bitmap_lock_); 496 497 // No thread saftey analysis since we call this everywhere and it is impossible to find a proper 498 // lock ordering for it. 499 void VerifyObjectBody(const mirror::Object *obj) NO_THREAD_SAFETY_ANALYSIS; 500 501 static void VerificationCallback(mirror::Object* obj, void* arg) 502 SHARED_LOCKS_REQUIRED(GlobalSychronization::heap_bitmap_lock_); 503 504 // Swap the allocation stack with the live stack. 505 void SwapStacks(); 506 507 // Clear cards and update the mod union table. 508 void ProcessCards(base::TimingLogger& timings); 509 510 // All-known continuous spaces, where objects lie within fixed bounds. 511 std::vector<space::ContinuousSpace*> continuous_spaces_; 512 513 // All-known discontinuous spaces, where objects may be placed throughout virtual memory. 514 std::vector<space::DiscontinuousSpace*> discontinuous_spaces_; 515 516 // The allocation space we are currently allocating into. 517 space::DlMallocSpace* alloc_space_; 518 519 // The large object space we are currently allocating into. 520 space::LargeObjectSpace* large_object_space_; 521 522 // The card table, dirtied by the write barrier. 523 UniquePtr<accounting::CardTable> card_table_; 524 525 // The mod-union table remembers all of the references from the image space to the alloc / 526 // zygote spaces to allow the card table to be cleared. 527 UniquePtr<accounting::ModUnionTable> image_mod_union_table_; 528 529 // This table holds all of the references from the zygote space to the alloc space. 530 UniquePtr<accounting::ModUnionTable> zygote_mod_union_table_; 531 532 // What kind of concurrency behavior is the runtime after? True for concurrent mark sweep GC, 533 // false for stop-the-world mark sweep. 534 const bool concurrent_gc_; 535 536 // How many GC threads we may use for paused parts of garbage collection. 537 const size_t parallel_gc_threads_; 538 539 // How many GC threads we may use for unpaused parts of garbage collection. 540 const size_t conc_gc_threads_; 541 542 // Boolean for if we are in low memory mode. 543 const bool low_memory_mode_; 544 545 // If we get a pause longer than long pause log threshold, then we print out the GC after it 546 // finishes. 547 const size_t long_pause_log_threshold_; 548 549 // If we get a GC longer than long GC log threshold, then we print out the GC after it finishes. 550 const size_t long_gc_log_threshold_; 551 552 // If we ignore the max footprint it lets the heap grow until it hits the heap capacity, this is 553 // useful for benchmarking since it reduces time spent in GC to a low %. 554 const bool ignore_max_footprint_; 555 556 // If we have a zygote space. 557 bool have_zygote_space_; 558 559 // Guards access to the state of GC, associated conditional variable is used to signal when a GC 560 // completes. 561 Mutex* gc_complete_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 562 UniquePtr<ConditionVariable> gc_complete_cond_ GUARDED_BY(gc_complete_lock_); 563 564 // Mutexes held when adding references to reference queues. 565 // TODO: move to a UniquePtr, currently annotalysis is confused that UniquePtr isn't lockable. 566 Mutex* soft_ref_queue_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 567 Mutex* weak_ref_queue_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 568 Mutex* finalizer_ref_queue_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 569 Mutex* phantom_ref_queue_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 570 571 // True while the garbage collector is running. 572 volatile bool is_gc_running_ GUARDED_BY(gc_complete_lock_); 573 574 // Last Gc type we ran. Used by WaitForConcurrentGc to know which Gc was waited on. 575 volatile collector::GcType last_gc_type_ GUARDED_BY(gc_complete_lock_); 576 collector::GcType next_gc_type_; 577 578 // Maximum size that the heap can reach. 579 const size_t capacity_; 580 581 // The size the heap is limited to. This is initially smaller than capacity, but for largeHeap 582 // programs it is "cleared" making it the same as capacity. 583 size_t growth_limit_; 584 585 // When the number of bytes allocated exceeds the footprint TryAllocate returns NULL indicating 586 // a GC should be triggered. 587 size_t max_allowed_footprint_; 588 589 // The watermark at which a concurrent GC is requested by registerNativeAllocation. 590 size_t native_footprint_gc_watermark_; 591 592 // The watermark at which a GC is performed inside of registerNativeAllocation. 593 size_t native_footprint_limit_; 594 595 // Activity manager members. 596 jclass activity_thread_class_; 597 jclass application_thread_class_; 598 jobject activity_thread_; 599 jobject application_thread_; 600 jfieldID last_process_state_id_; 601 602 // Process states which care about pause times. 603 std::set<int> process_state_cares_about_pause_time_; 604 605 // Whether or not we currently care about pause times. 606 bool care_about_pause_times_; 607 608 // When num_bytes_allocated_ exceeds this amount then a concurrent GC should be requested so that 609 // it completes ahead of an allocation failing. 610 size_t concurrent_start_bytes_; 611 612 // Since the heap was created, how many bytes have been freed. 613 size_t total_bytes_freed_ever_; 614 615 // Since the heap was created, how many objects have been freed. 616 size_t total_objects_freed_ever_; 617 618 // Primitive objects larger than this size are put in the large object space. 619 const size_t large_object_threshold_; 620 621 // Number of bytes allocated. Adjusted after each allocation and free. 622 AtomicInteger num_bytes_allocated_; 623 624 // Bytes which are allocated and managed by native code but still need to be accounted for. 625 AtomicInteger native_bytes_allocated_; 626 627 // Data structure GC overhead. 628 AtomicInteger gc_memory_overhead_; 629 630 // Heap verification flags. 631 const bool verify_missing_card_marks_; 632 const bool verify_system_weaks_; 633 const bool verify_pre_gc_heap_; 634 const bool verify_post_gc_heap_; 635 const bool verify_mod_union_table_; 636 637 // Parallel GC data structures. 638 UniquePtr<ThreadPool> thread_pool_; 639 640 // Sticky mark bits GC has some overhead, so if we have less a few megabytes of AllocSpace then 641 // it's probably better to just do a partial GC. 642 const size_t min_alloc_space_size_for_sticky_gc_; 643 644 // Minimum remaining size for sticky GC. Since sticky GC doesn't free up as much memory as a 645 // normal GC, it is important to not use it when we are almost out of memory. 646 const size_t min_remaining_space_for_sticky_gc_; 647 648 // The last time a heap trim occurred. 649 uint64_t last_trim_time_ms_; 650 651 // The nanosecond time at which the last GC ended. 652 uint64_t last_gc_time_ns_; 653 654 // How many bytes were allocated at the end of the last GC. 655 uint64_t last_gc_size_; 656 657 // Estimated allocation rate (bytes / second). Computed between the time of the last GC cycle 658 // and the start of the current one. 659 uint64_t allocation_rate_; 660 661 // For a GC cycle, a bitmap that is set corresponding to the 662 UniquePtr<accounting::HeapBitmap> live_bitmap_ GUARDED_BY(Locks::heap_bitmap_lock_); 663 UniquePtr<accounting::HeapBitmap> mark_bitmap_ GUARDED_BY(Locks::heap_bitmap_lock_); 664 665 // Mark stack that we reuse to avoid re-allocating the mark stack. 666 UniquePtr<accounting::ObjectStack> mark_stack_; 667 668 // Allocation stack, new allocations go here so that we can do sticky mark bits. This enables us 669 // to use the live bitmap as the old mark bitmap. 670 const size_t max_allocation_stack_size_; 671 bool is_allocation_stack_sorted_; 672 UniquePtr<accounting::ObjectStack> allocation_stack_; 673 674 // Second allocation stack so that we can process allocation with the heap unlocked. 675 UniquePtr<accounting::ObjectStack> live_stack_; 676 677 // offset of java.lang.ref.Reference.referent 678 MemberOffset reference_referent_offset_; 679 680 // offset of java.lang.ref.Reference.queue 681 MemberOffset reference_queue_offset_; 682 683 // offset of java.lang.ref.Reference.queueNext 684 MemberOffset reference_queueNext_offset_; 685 686 // offset of java.lang.ref.Reference.pendingNext 687 MemberOffset reference_pendingNext_offset_; 688 689 // offset of java.lang.ref.FinalizerReference.zombie 690 MemberOffset finalizer_reference_zombie_offset_; 691 692 // Minimum free guarantees that you always have at least min_free_ free bytes after growing for 693 // utilization, regardless of target utilization ratio. 694 size_t min_free_; 695 696 // The ideal maximum free size, when we grow the heap for utilization. 697 size_t max_free_; 698 699 // Target ideal heap utilization ratio 700 double target_utilization_; 701 702 // Total time which mutators are paused or waiting for GC to complete. 703 uint64_t total_wait_time_; 704 705 // Total number of objects allocated in microseconds. 706 AtomicInteger total_allocation_time_; 707 708 // The current state of heap verification, may be enabled or disabled. 709 HeapVerificationMode verify_object_mode_; 710 711 std::vector<collector::MarkSweep*> mark_sweep_collectors_; 712 713 const bool running_on_valgrind_; 714 715 friend class collector::MarkSweep; 716 friend class VerifyReferenceCardVisitor; 717 friend class VerifyReferenceVisitor; 718 friend class VerifyObjectVisitor; 719 friend class ScopedHeapLock; 720 friend class space::SpaceTest; 721 722 DISALLOW_IMPLICIT_CONSTRUCTORS(Heap); 723 }; 724 725 } // namespace gc 726 } // namespace art 727 728 #endif // ART_RUNTIME_GC_HEAP_H_ 729