HeapSource.h revision dde8ab037540aaec554a471d67613b959cc0e9f4
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 192ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#include "alloc/HeapInternal.h" // for GcHeap 202ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* dlmalloc uses one size_t per allocated chunk. 222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_CHUNK_OVERHEAD (1 * sizeof (size_t)) 242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_WORST_CHUNK_OVERHEAD (32 * sizeof (size_t)) 252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 262ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* The largest number of separate heaps we can handle. 272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 282ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#define HEAP_SOURCE_MAX_HEAP_COUNT 3 292ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 302ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Initializes the heap source; must be called before any other 322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * dvmHeapSource*() functions. 332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source ProjectGcHeap *dvmHeapSourceStartup(size_t startSize, size_t absoluteMaxSize); 352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * If the HeapSource was created while in zygote mode, this 382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * will create a new heap for post-zygote allocations. 392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Having a separate heap should maximize the number of pages 402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * that a given app_process shares with the zygote process. 412ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 422ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceStartupAfterZygote(void); 432ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * If the HeapSource was created while in zygote mode, this 462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * will create an additional zygote heap before the first fork(). 472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Having a separate heap should reduce the number of shared 482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * pages subsequently touched by the zygote process. 492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceStartupBeforeFork(void); 512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Tears down the heap source and frees any resources associated with it. 542ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceShutdown(GcHeap *gcHeap); 562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Writes shallow copies of the currently-used bitmaps into outBitmaps, 592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * returning the number of bitmaps written. Returns <0 if the array 602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * was not long enough. 612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 622ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectssize_t dvmHeapSourceGetObjectBitmaps(HeapBitmap outBitmaps[], 632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project size_t maxBitmaps); 642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 652ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 662ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Replaces the object location HeapBitmaps with the elements of 672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * <objectBitmaps>. The elements of <objectBitmaps> are overwritten 682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * with shallow copies of the old bitmaps. 692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * 702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns false if the number of bitmaps doesn't match the number 712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * of heaps. 722ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 732ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceReplaceObjectBitmaps(HeapBitmap objectBitmaps[], 742ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project size_t nBitmaps); 752ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 762ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 772ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the requested value. If the per-heap stats are requested, fill 782ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * them as well. 792ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 802ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourceValueSpec { 812ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_FOOTPRINT, 822ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_ALLOWED_FOOTPRINT, 832ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_BYTES_ALLOCATED, 842ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_OBJECTS_ALLOCATED, 852ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_EXTERNAL_BYTES_ALLOCATED, 862ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_EXTERNAL_LIMIT 872ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project}; 882ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetValue(enum HeapSourceValueSpec spec, 892ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project size_t perHeapStats[], size_t arrayLen); 902ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 912ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 922ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data. 932ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 942ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAlloc(size_t n); 952ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 962ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 972ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Allocates <n> bytes of zeroed data, growing up to absoluteMaxSize 982ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * if necessary. 992ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1002ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid *dvmHeapSourceAllocAndGrow(size_t n); 1012ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1022ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1032ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Frees the memory pointed to by <ptr>, which may be NULL. 1042ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1052ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceFree(void *ptr); 1062ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1072ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 108dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * Frees the first numPtrs objects in the ptrs list. The list must 109dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * contain addresses all in the same mspace, and must be in increasing 110dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * order. This implies that there are no duplicates, and no entries 111dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes * are NULL. 112dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes */ 113dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayesvoid dvmHeapSourceFreeList(size_t numPtrs, void **ptrs); 114dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes 115dde8ab037540aaec554a471d67613b959cc0e9f4Barry Hayes/* 1162ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns true iff <ptr> was allocated from the heap source. 1172ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1182ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceContains(const void *ptr); 1192ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1202ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1212ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the value of the requested flag. 1222ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1232ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectenum HeapSourcePtrFlag { 1242ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_CONTAINS, // identical to dvmHeapSourceContains() 1252ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project HS_ALLOCATED_IN_ZYGOTE 1262ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project}; 1272ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectbool dvmHeapSourceGetPtrFlag(const void *ptr, enum HeapSourcePtrFlag flag); 1282ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1292ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1302ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of usable bytes in an allocated chunk; the size 1312ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * may be larger than the size passed to dvmHeapSourceAlloc(). 1322ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1332ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceChunkSize(const void *ptr); 1342ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1352ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1362ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Returns the number of bytes that the heap source has allocated 1372ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * from the system using sbrk/mmap, etc. 1382ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1392ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceFootprint(void); 1402ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1412ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1422ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the maximum number of bytes that the heap source is allowed 1432ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * to allocate from the system. 1442ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1452ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetIdealFootprint(void); 1462ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1472ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1482ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Given the current contents of the heap, increase the allowed 1492ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * heap footprint to match the target utilization ratio. This 1502ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * should only be called immediately after a full mark/sweep. 1512ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1522ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceGrowForUtilization(void); 1532ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1542ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1552ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Return unused memory to the system if possible. If <bytesTrimmed> 1562ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * is non-NULL, the number of bytes returned to the system is written to it. 1572ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1582ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceTrim(size_t bytesTrimmed[], size_t arrayLen); 1592ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1602ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1612ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Walks over the heap source and passes every allocated and 1622ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * free chunk to the callback. 1632ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1642ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectvoid dvmHeapSourceWalk(void(*callback)(const void *chunkptr, size_t chunklen, 1652ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project const void *userptr, size_t userlen, 1662ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project void *arg), 1672ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project void *arg); 1682ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project/* 1692ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project * Gets the number of heaps available in the heap source. 1702ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project */ 1712ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Projectsize_t dvmHeapSourceGetNumHeaps(void); 1722ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project 1732ad60cfc28e14ee8f0bb038720836a4696c478aThe Android Open Source Project#endif // _DALVIK_HEAP_SOURCE 174