HeapSource.h revision b874ab98306a109c4988bb1cde687a24f4f8201f
12ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
22ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
32ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project *
42ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
52ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * you may not use this file except in compliance with the License.
62ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * You may obtain a copy of the License at
72ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project *
82ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
92ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project *
102ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
112ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
122ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * See the License for the specific language governing permissions and
142ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * limitations under the License.
152ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
162ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#ifndef _DALVIK_HEAP_SOURCE
172ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define _DALVIK_HEAP_SOURCE
182ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
19d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro#include "alloc/Heap.h"
202ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#include "alloc/HeapInternal.h" // for GcHeap
212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* dlmalloc uses one size_t per allocated chunk.
232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_CHUNK_OVERHEAD         (1 * sizeof (size_t))
252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_WORST_CHUNK_OVERHEAD   (32 * sizeof (size_t))
262ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* The largest number of separate heaps we can handle.
282ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
29c8e06c8dba30f01d3cf6506c553041c340b312afCarl Shapiro#define HEAP_SOURCE_MAX_HEAP_COUNT 2
302ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Initializes the heap source; must be called before any other
332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * dvmHeapSource*() functions.
342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source ProjectGcHeap *dvmHeapSourceStartup(size_t startSize, size_t absoluteMaxSize);
362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * If the HeapSource was created while in zygote mode, this
39ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * will create a new heap for post-zygote allocations.
40ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Having a separate heap should maximize the number of pages
41ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * that a given app_process shares with the zygote process.
42ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */
43ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirobool dvmHeapSourceStartupAfterZygote(void);
44ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro
45ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/*
46ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * If the HeapSource was created while in zygote mode, this
472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * will create an additional zygote heap before the first fork().
482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Having a separate heap should reduce the number of shared
492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * pages subsequently touched by the zygote process.
502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceStartupBeforeFork(void);
522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
54ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * Shutdown any threads internal to the heap source.  This should be
55ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro * called before the heap source itself is shutdown.
56ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro */
57ec805eaed940e40212e85b58b163c7649feaca56Carl Shapirovoid dvmHeapSourceThreadShutdown(void);
58ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro
59ec805eaed940e40212e85b58b163c7649feaca56Carl Shapiro/*
602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Tears down the heap source and frees any resources associated with it.
612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
62a199eb70871a8c142a723d76b1b08939286a3199Carl Shapirovoid dvmHeapSourceShutdown(GcHeap **gcHeap);
632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
65f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro * Initializes a vector of object and mark bits to the object and mark
66e168ebd5a7cfc57936c16ff7d7f7063e967bdb9dBarry Hayes * bits of each heap.
672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
68f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapirovoid dvmHeapSourceGetObjectBitmaps(HeapBitmap objBits[], HeapBitmap markBits[],
69f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro                                   size_t numHeaps);
702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
72962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes * Get the bitmap representing all live objects.
73962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes */
74ec805eaed940e40212e85b58b163c7649feaca56Carl ShapiroHeapBitmap *dvmHeapSourceGetLiveBits(void);
75962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes
76962adba4e5db286a36bc8024f5c023bcf6f29312Barry Hayes/*
77b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes * Gets the begining of the allocation for the HeapSource.
78b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes */
79b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayesvoid *dvmHeapSourceGetBase(void);
80b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes
81b874ab98306a109c4988bb1cde687a24f4f8201fBarry Hayes/*
822ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the requested value. If the per-heap stats are requested, fill
832ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * them as well.
842ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
852ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourceValueSpec {
862ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_FOOTPRINT,
872ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_ALLOWED_FOOTPRINT,
882ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_BYTES_ALLOCATED,
892ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_OBJECTS_ALLOCATED,
902ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_EXTERNAL_BYTES_ALLOCATED,
912ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_EXTERNAL_LIMIT
922ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project};
93de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapirosize_t dvmHeapSourceGetValue(enum HeapSourceValueSpec spec,
942ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                             size_t perHeapStats[], size_t arrayLen);
952ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
962ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
972ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data.
982ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
992ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAlloc(size_t n);
1002ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1012ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1022ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data, growing up to absoluteMaxSize
1032ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * if necessary.
1042ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1052ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAllocAndGrow(size_t n);
1062ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1072ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1082ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Frees the memory pointed to by <ptr>, which may be NULL.
1092ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1102ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceFree(void *ptr);
1112ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1122ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
113dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * Frees the first numPtrs objects in the ptrs list. The list must
114dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * contain addresses all in the same mspace, and must be in increasing
115dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * order. This implies that there are no duplicates, and no entries
116dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * are NULL.
117dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes */
118dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayesvoid dvmHeapSourceFreeList(size_t numPtrs, void **ptrs);
119dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes
120dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes/*
1212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns true iff <ptr> was allocated from the heap source.
1222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceContains(const void *ptr);
1242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
126364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes * Returns true iff <ptr> is within the address space managed by heap source.
127364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes */
128364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayesbool dvmHeapSourceContainsAddress(const void *ptr);
129364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes
130364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes/*
1312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the value of the requested flag.
1322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourcePtrFlag {
1342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_CONTAINS,    // identical to dvmHeapSourceContains()
1352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project    HS_ALLOCATED_IN_ZYGOTE
1362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project};
1372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceGetPtrFlag(const void *ptr, enum HeapSourcePtrFlag flag);
1382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of usable bytes in an allocated chunk; the size
1412ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * may be larger than the size passed to dvmHeapSourceAlloc().
1422ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1432ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceChunkSize(const void *ptr);
1442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of bytes that the heap source has allocated
1472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * from the system using sbrk/mmap, etc.
1482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceFootprint(void);
1502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the maximum number of bytes that the heap source is allowed
1532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * to allocate from the system.
1542ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetIdealFootprint(void);
1562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Given the current contents of the heap, increase the allowed
1592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * heap footprint to match the target utilization ratio.  This
1602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * should only be called immediately after a full mark/sweep.
1612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1622ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceGrowForUtilization(void);
1632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1652ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Return unused memory to the system if possible.  If <bytesTrimmed>
1662ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * is non-NULL, the number of bytes returned to the system is written to it.
1672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceTrim(size_t bytesTrimmed[], size_t arrayLen);
1692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
1702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Walks over the heap source and passes every allocated and
1722ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * free chunk to the callback.
1732ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1742ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceWalk(void(*callback)(const void *chunkptr, size_t chunklen,
1752ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                                      const void *userptr, size_t userlen,
1762ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                                      void *arg),
1772ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project                       void *arg);
1782ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/*
1792ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the number of heaps available in the heap source.
1802ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */
1812ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetNumHeaps(void);
1822ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project
183f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro/*
184f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro * Exchanges the mark and object bitmaps and zeros the mark bitmap.
185f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro */
186f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapirovoid dvmHeapSourceSwapBitmaps(void);
187f373efd3321307f54c102e02b3ee7eb922c4765cCarl Shapiro
188d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/*
189425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * Marks all objects inside the immune region of the heap. Addresses
190425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * at or above this pointer are threatened, addresses below this
191425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * pointer are immune.
192d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */
193425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayesvoid dvmMarkImmuneObjects(const char *immuneLimit);
194d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro
195d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro/*
196d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * Returns a pointer that demarcates the threatened region of the
197d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro * heap.  Addresses at or above this pointer are threatened, addresses
198425848f6b64603f79c336c08b6e1cbca1a9f6048Barry Hayes * below this pointer are immune.
199d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro */
200d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapirovoid *dvmHeapSourceGetImmuneLimit(GcMode mode);
201d25566d9278e6424e521f4b7148ac31480e60c5cCarl Shapiro
2022ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#endif  // _DALVIK_HEAP_SOURCE
203