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 #ifndef _DALVIK_HEAP_SOURCE 17 #define _DALVIK_HEAP_SOURCE 18 19 #include "alloc/Heap.h" 20 #include "alloc/HeapInternal.h" // for GcHeap 21 22 /* dlmalloc uses one size_t per allocated chunk. 23 */ 24 #define HEAP_SOURCE_CHUNK_OVERHEAD (1 * sizeof (size_t)) 25 #define HEAP_SOURCE_WORST_CHUNK_OVERHEAD (32 * sizeof (size_t)) 26 27 /* The largest number of separate heaps we can handle. 28 */ 29 #define HEAP_SOURCE_MAX_HEAP_COUNT 2 30 31 /* 32 * Initializes the heap source; must be called before any other 33 * dvmHeapSource*() functions. 34 */ 35 GcHeap *dvmHeapSourceStartup(size_t startSize, size_t absoluteMaxSize); 36 37 /* 38 * If the HeapSource was created while in zygote mode, this 39 * will create a new heap for post-zygote allocations. 40 * Having a separate heap should maximize the number of pages 41 * that a given app_process shares with the zygote process. 42 */ 43 bool dvmHeapSourceStartupAfterZygote(void); 44 45 /* 46 * If the HeapSource was created while in zygote mode, this 47 * will create an additional zygote heap before the first fork(). 48 * Having a separate heap should reduce the number of shared 49 * pages subsequently touched by the zygote process. 50 */ 51 bool dvmHeapSourceStartupBeforeFork(void); 52 53 /* 54 * Shutdown any threads internal to the heap source. This should be 55 * called before the heap source itself is shutdown. 56 */ 57 void dvmHeapSourceThreadShutdown(void); 58 59 /* 60 * Tears down the heap source and frees any resources associated with it. 61 */ 62 void dvmHeapSourceShutdown(GcHeap **gcHeap); 63 64 /* 65 * Initializes a vector of object and mark bits to the object and mark 66 * bits of each heap. 67 */ 68 void dvmHeapSourceGetObjectBitmaps(HeapBitmap liveBits[], HeapBitmap markBits[], 69 size_t numHeaps); 70 71 /* 72 * Get the bitmap representing all live objects. 73 */ 74 HeapBitmap *dvmHeapSourceGetLiveBits(void); 75 76 /* 77 * Gets the begining of the allocation for the HeapSource. 78 */ 79 void *dvmHeapSourceGetBase(void); 80 81 /* 82 * Returns the requested value. If the per-heap stats are requested, fill 83 * them as well. 84 */ 85 enum HeapSourceValueSpec { 86 HS_FOOTPRINT, 87 HS_ALLOWED_FOOTPRINT, 88 HS_BYTES_ALLOCATED, 89 HS_OBJECTS_ALLOCATED, 90 HS_EXTERNAL_BYTES_ALLOCATED, 91 HS_EXTERNAL_LIMIT 92 }; 93 size_t dvmHeapSourceGetValue(enum HeapSourceValueSpec spec, 94 size_t perHeapStats[], size_t arrayLen); 95 96 /* 97 * Allocates <n> bytes of zeroed data. 98 */ 99 void *dvmHeapSourceAlloc(size_t n); 100 101 /* 102 * Allocates <n> bytes of zeroed data, growing up to absoluteMaxSize 103 * if necessary. 104 */ 105 void *dvmHeapSourceAllocAndGrow(size_t n); 106 107 /* 108 * Frees the first numPtrs objects in the ptrs list and returns the 109 * amount of reclaimed storage. The list must contain addresses all 110 * in the same mspace, and must be in increasing order. This implies 111 * that there are no duplicates, and no entries are NULL. 112 */ 113 size_t dvmHeapSourceFreeList(size_t numPtrs, void **ptrs); 114 115 /* 116 * Returns true iff <ptr> was allocated from the heap source. 117 */ 118 bool dvmHeapSourceContains(const void *ptr); 119 120 /* 121 * Returns true iff <ptr> is within the address space managed by heap source. 122 */ 123 bool dvmHeapSourceContainsAddress(const void *ptr); 124 125 /* 126 * Returns the value of the requested flag. 127 */ 128 enum HeapSourcePtrFlag { 129 HS_CONTAINS, // identical to dvmHeapSourceContains() 130 HS_ALLOCATED_IN_ZYGOTE 131 }; 132 bool dvmHeapSourceGetPtrFlag(const void *ptr, enum HeapSourcePtrFlag flag); 133 134 /* 135 * Returns the number of usable bytes in an allocated chunk; the size 136 * may be larger than the size passed to dvmHeapSourceAlloc(). 137 */ 138 size_t dvmHeapSourceChunkSize(const void *ptr); 139 140 /* 141 * Returns the number of bytes that the heap source has allocated 142 * from the system using sbrk/mmap, etc. 143 */ 144 size_t dvmHeapSourceFootprint(void); 145 146 /* 147 * Gets the maximum number of bytes that the heap source is allowed 148 * to allocate from the system. 149 */ 150 size_t dvmHeapSourceGetIdealFootprint(void); 151 152 /* 153 * Given the current contents of the heap, increase the allowed 154 * heap footprint to match the target utilization ratio. This 155 * should only be called immediately after a full mark/sweep. 156 */ 157 void dvmHeapSourceGrowForUtilization(void); 158 159 /* 160 * Return unused memory to the system if possible. If <bytesTrimmed> 161 * is non-NULL, the number of bytes returned to the system is written to it. 162 */ 163 void dvmHeapSourceTrim(size_t bytesTrimmed[], size_t arrayLen); 164 165 /* 166 * Walks over the heap source and passes every allocated and 167 * free chunk to the callback. 168 */ 169 void dvmHeapSourceWalk(void(*callback)(const void *chunkptr, size_t chunklen, 170 const void *userptr, size_t userlen, 171 void *arg), 172 void *arg); 173 /* 174 * Gets the number of heaps available in the heap source. 175 */ 176 size_t dvmHeapSourceGetNumHeaps(void); 177 178 /* 179 * Exchanges the mark and object bitmaps. 180 */ 181 void dvmHeapSourceSwapBitmaps(void); 182 183 /* 184 * Zeroes the mark bitmap. 185 */ 186 void dvmHeapSourceZeroMarkBitmap(void); 187 188 /* 189 * Marks all objects inside the immune region of the heap. Addresses 190 * at or above this pointer are threatened, addresses below this 191 * pointer are immune. 192 */ 193 void dvmMarkImmuneObjects(const char *immuneLimit); 194 195 /* 196 * Returns a pointer that demarcates the threatened region of the 197 * heap. Addresses at or above this pointer are threatened, addresses 198 * below this pointer are immune. 199 */ 200 void *dvmHeapSourceGetImmuneLimit(GcMode mode); 201 202 #endif // _DALVIK_HEAP_SOURCE 203