blob: bc06289d5187266478d54709699caa4689d2b94b [file] [log] [blame]
Carl Shapiro1fb86202011-06-27 17:43:13 -07001// Copyright 2011 Google Inc. All Rights Reserved.
Carl Shapiro1fb86202011-06-27 17:43:13 -07002
3#ifndef ART_SRC_HEAP_H_
4#define ART_SRC_HEAP_H_
5
Carl Shapiro58551df2011-07-24 03:09:51 -07006#include <vector>
7
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07008#include "globals.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07009#include "object_bitmap.h"
Ian Rogers0cfe1fb2011-08-26 03:29:44 -070010#include "offsets.h"
Carl Shapiro1fb86202011-06-27 17:43:13 -070011
12namespace art {
13
Brian Carlstroma40f9bc2011-07-26 21:26:07 -070014class Class;
Elliott Hughes410c0c82011-09-01 17:58:25 -070015class Mutex;
Brian Carlstroma40f9bc2011-07-26 21:26:07 -070016class Object;
Carl Shapiro69759ea2011-07-21 18:13:35 -070017class Space;
18class HeapBitmap;
19
Carl Shapiro1fb86202011-06-27 17:43:13 -070020class Heap {
21 public:
Brian Carlstrom8a436592011-08-15 21:27:23 -070022 static const size_t kInitialSize = 16 * MB;
Carl Shapiro69759ea2011-07-21 18:13:35 -070023
Brian Carlstrom4a96b602011-07-26 16:40:23 -070024 static const size_t kMaximumSize = 64 * MB;
Carl Shapiro69759ea2011-07-21 18:13:35 -070025
Elliott Hughes410c0c82011-09-01 17:58:25 -070026 typedef void (RootVisitor)(const Object* root, void* arg);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070027
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070028 // Create a heap with the requested sizes. optional boot image may
29 // be NULL, otherwise it is an image filename created by ImageWriter.
30 static bool Init(size_t starting_size, size_t maximum_size, const char* boot_image_file_name);
Carl Shapiro61e019d2011-07-14 16:53:09 -070031
Carl Shapiro69759ea2011-07-21 18:13:35 -070032 static void Destroy();
Brian Carlstroma7f4f482011-07-17 17:01:34 -070033
Brian Carlstroma40f9bc2011-07-26 21:26:07 -070034 // Allocates and initializes storage for an object instance.
Carl Shapiro58551df2011-07-24 03:09:51 -070035 static Object* AllocObject(Class* klass, size_t num_bytes);
Brian Carlstroma7f4f482011-07-17 17:01:34 -070036
Elliott Hughesa2501992011-08-26 19:39:54 -070037 // Check sanity of given reference. Requires the heap lock.
Elliott Hughescf4c6c42011-09-01 15:16:42 -070038 static void VerifyObject(const Object *obj);
Ian Rogers408f79a2011-08-23 18:22:33 -070039
Ian Rogers0cfe1fb2011-08-26 03:29:44 -070040 // Check sanity of all live references. Requires the heap lock.
41 static void VerifyHeap();
42
Elliott Hughesa2501992011-08-26 19:39:54 -070043 // A weaker test than VerifyObject that doesn't require the heap lock,
44 // and doesn't abort on error, allowing the caller to report more
45 // meaningful diagnostics.
Elliott Hughescf4c6c42011-09-01 15:16:42 -070046 static bool IsHeapAddress(const Object* obj);
Elliott Hughesa2501992011-08-26 19:39:54 -070047
Carl Shapiro69759ea2011-07-21 18:13:35 -070048 // Initiates an explicit garbage collection.
49 static void CollectGarbage();
50
Elliott Hughesbf86d042011-08-31 17:53:14 -070051 // Implements java.lang.Runtime.maxMemory.
52 static int64_t GetMaxMemory();
53 // Implements java.lang.Runtime.totalMemory.
54 static int64_t GetTotalMemory();
55 // Implements java.lang.Runtime.freeMemory.
56 static int64_t GetFreeMemory();
57
Carl Shapiro69759ea2011-07-21 18:13:35 -070058 // Blocks the caller until the garbage collector becomes idle.
59 static void WaitForConcurrentGcToComplete();
60
61 static Mutex* GetLock() {
62 return lock_;
Carl Shapiro5fafe2b2011-07-09 15:34:41 -070063 }
Carl Shapiro61e019d2011-07-14 16:53:09 -070064
Carl Shapiro58551df2011-07-24 03:09:51 -070065 static const std::vector<Space*>& GetSpaces() {
66 return spaces_;
67 }
Carl Shapiro61e019d2011-07-14 16:53:09 -070068
Brian Carlstroma663ea52011-08-19 23:33:41 -070069 static Space* GetBootSpace() {
70 return boot_space_;
71 }
72
Carl Shapiro58551df2011-07-24 03:09:51 -070073 static HeapBitmap* GetLiveBits() {
74 return live_bitmap_;
Carl Shapiro744ad052011-08-06 15:53:36 -070075 }
Carl Shapiro58551df2011-07-24 03:09:51 -070076
77 static HeapBitmap* GetMarkBits() {
78 return mark_bitmap_;
Carl Shapiro744ad052011-08-06 15:53:36 -070079 }
Carl Shapiro58551df2011-07-24 03:09:51 -070080
Ian Rogers0cfe1fb2011-08-26 03:29:44 -070081 static void SetReferenceOffsets(MemberOffset reference_referent_offset,
82 MemberOffset reference_queue_offset,
83 MemberOffset reference_queueNext_offset,
84 MemberOffset reference_pendingNext_offset,
85 MemberOffset finalizer_reference_zombie_offset) {
86 CHECK_NE(reference_referent_offset.Uint32Value(), 0U);
87 CHECK_NE(reference_queue_offset.Uint32Value(), 0U);
88 CHECK_NE(reference_queueNext_offset.Uint32Value(), 0U);
89 CHECK_NE(reference_pendingNext_offset.Uint32Value(), 0U);
90 CHECK_NE(finalizer_reference_zombie_offset.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -070091 reference_referent_offset_ = reference_referent_offset;
92 reference_queue_offset_ = reference_queue_offset;
93 reference_queueNext_offset_ = reference_queueNext_offset;
94 reference_pendingNext_offset_ = reference_pendingNext_offset;
95 finalizer_reference_zombie_offset_ = finalizer_reference_zombie_offset;
96 }
97
Ian Rogers0cfe1fb2011-08-26 03:29:44 -070098 static MemberOffset GetReferenceReferentOffset() {
99 DCHECK_NE(reference_referent_offset_.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -0700100 return reference_referent_offset_;
101 }
102
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700103 static MemberOffset GetReferenceQueueOffset() {
104 DCHECK_NE(reference_queue_offset_.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -0700105 return reference_queue_offset_;
106 }
107
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700108 static MemberOffset GetReferenceQueueNextOffset() {
109 DCHECK_NE(reference_queueNext_offset_.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -0700110 return reference_queueNext_offset_;
111 }
112
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700113 static MemberOffset GetReferencePendingNextOffset() {
114 DCHECK_NE(reference_pendingNext_offset_.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -0700115 return reference_pendingNext_offset_;
116 }
117
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700118 static MemberOffset GetFinalizerReferenceZombieOffset() {
119 DCHECK_NE(finalizer_reference_zombie_offset_.Uint32Value(), 0U);
Brian Carlstrom1f870082011-08-23 16:02:11 -0700120 return finalizer_reference_zombie_offset_;
121 }
122
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700123 static void DisableObjectValidation() {
124 // TODO: remove this hack necessary for image writing
125 verify_object_disabled_ = true;
126 }
127
Carl Shapiro58551df2011-07-24 03:09:51 -0700128 private:
129 // Allocates uninitialized storage.
Carl Shapiro69759ea2011-07-21 18:13:35 -0700130 static Object* Allocate(size_t num_bytes);
Carl Shapiro58551df2011-07-24 03:09:51 -0700131 static Object* Allocate(Space* space, size_t num_bytes);
132
133 static void RecordAllocation(Space* space, const Object* object);
134 static void RecordFree(Space* space, const Object* object);
Brian Carlstrom9cff8e12011-08-18 16:47:29 -0700135 static void RecordImageAllocations(Space* space);
Carl Shapiro69759ea2011-07-21 18:13:35 -0700136
137 static void CollectGarbageInternal();
138
139 static void GrowForUtilization();
140
141 static Mutex* lock_;
142
Carl Shapiro58551df2011-07-24 03:09:51 -0700143 static std::vector<Space*> spaces_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700144
Brian Carlstroma663ea52011-08-19 23:33:41 -0700145 // Space loaded from an image
146 static Space* boot_space_;
147
Brian Carlstrom4a289ed2011-08-16 17:17:49 -0700148 // default Space for allocations
149 static Space* alloc_space_;
150
Carl Shapiro69759ea2011-07-21 18:13:35 -0700151 static HeapBitmap* mark_bitmap_;
152
153 static HeapBitmap* live_bitmap_;
154
Carl Shapiro58551df2011-07-24 03:09:51 -0700155 // The maximum size of the heap in bytes.
Carl Shapiro69759ea2011-07-21 18:13:35 -0700156 static size_t maximum_size_;
157
Carl Shapiro58551df2011-07-24 03:09:51 -0700158 // True while the garbage collector is running.
Carl Shapiro69759ea2011-07-21 18:13:35 -0700159 static bool is_gc_running_;
160
Carl Shapiro58551df2011-07-24 03:09:51 -0700161 // Number of bytes allocated. Adjusted after each allocation and
162 // free.
163 static size_t num_bytes_allocated_;
164
165 // Number of objects allocated. Adjusted after each allocation and
166 // free.
167 static size_t num_objects_allocated_;
168
Brian Carlstrom1f870082011-08-23 16:02:11 -0700169 // offset of java.lang.ref.Reference.referent
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700170 static MemberOffset reference_referent_offset_;
Brian Carlstrom1f870082011-08-23 16:02:11 -0700171
172 // offset of java.lang.ref.Reference.queue
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700173 static MemberOffset reference_queue_offset_;
Brian Carlstrom1f870082011-08-23 16:02:11 -0700174
175 // offset of java.lang.ref.Reference.queueNext
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700176 static MemberOffset reference_queueNext_offset_;
Brian Carlstrom1f870082011-08-23 16:02:11 -0700177
178 // offset of java.lang.ref.Reference.pendingNext
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700179 static MemberOffset reference_pendingNext_offset_;
Brian Carlstrom1f870082011-08-23 16:02:11 -0700180
181 // offset of java.lang.ref.FinalizerReference.zombie
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700182 static MemberOffset finalizer_reference_zombie_offset_;
183
184 static bool verify_object_disabled_;
Brian Carlstrom1f870082011-08-23 16:02:11 -0700185
Carl Shapiro69759ea2011-07-21 18:13:35 -0700186 DISALLOW_IMPLICIT_CONSTRUCTORS(Heap);
187};
188
Carl Shapiro1fb86202011-06-27 17:43:13 -0700189} // namespace art
190
191#endif // ART_SRC_HEAP_H_