/* * Given the current contents of the active heap, increase the allowed * heap footprint to match the target utilization ratio. This * should only be called immediately after a full mark/sweep. */ void dvmHeapSourceGrowForUtilization() { HS_BOILERPLATE(); HeapSource *hs = gHs; Heap* heap = hs2heap(hs); /* Use the current target utilization ratio to determine the * ideal heap size based on the size of the live set. * Note that only the active heap plays any part in this. * * Avoid letting the old heaps influence the target free size, * because they may be full of objects that aren't actually * in the working set. Just look at the allocated size of * the current heap. */ size_t currentHeapUsed = heap->bytesAllocated; size_t targetHeapSize = getUtilizationTarget(hs, currentHeapUsed); /* The ideal size includes the old heaps; add overhead so that * it can be immediately subtracted again in setIdealFootprint(). * If the target heap size would exceed the max, setIdealFootprint() * will clamp it to a legal value. */ size_t overhead = getSoftFootprint(false); setIdealFootprint(targetHeapSize + overhead); size_t freeBytes = getAllocLimit(hs); if (freeBytes < CONCURRENT_MIN_FREE) { /* Not enough free memory to allow a concurrent GC. */ heap->concurrentStartBytes = SIZE_MAX; } else { heap->concurrentStartBytes = freeBytes - CONCURRENT_START; } }
/* * Make the ideal footprint equal to the current footprint. */ static void snapIdealFootprint() { HS_BOILERPLATE(); HeapSource *hs = gHs; setIdealFootprint(getSoftFootprint(true) + hs->minFree); }
/* * Make the ideal footprint equal to the current footprint. */ static void snapIdealFootprint() { HS_BOILERPLATE(); /* Give IDEAL_FREE extra amount of room even for the * snapIdealFootprint case */ setIdealFootprint(getSoftFootprint(true) + heapIdeaFree); }
/* * Allocates <n> bytes of zeroed data, growing as much as possible * if necessary. */ void* dvmHeapSourceAllocAndGrow(size_t n) { HS_BOILERPLATE(); HeapSource *hs = gHs; Heap* heap = hs2heap(hs); void* ptr = dvmHeapSourceAlloc(n); if (ptr != NULL) { return ptr; } size_t oldIdealSize = hs->idealSize; if (isSoftLimited(hs)) { /* We're soft-limited. Try removing the soft limit to * see if we can allocate without actually growing. */ hs->softLimit = SIZE_MAX; ptr = dvmHeapSourceAlloc(n); if (ptr != NULL) { /* Removing the soft limit worked; fix things up to * reflect the new effective ideal size. */ snapIdealFootprint(); return ptr; } // softLimit intentionally left at SIZE_MAX. } /* We're not soft-limited. Grow the heap to satisfy the request. * If this call fails, no footprints will have changed. */ ptr = heapAllocAndGrow(hs, heap, n); if (ptr != NULL) { /* The allocation succeeded. Fix up the ideal size to * reflect any footprint modifications that had to happen. */ snapIdealFootprint(); } else { /* We just couldn't do it. Restore the original ideal size, * fixing up softLimit if necessary. */ setIdealFootprint(oldIdealSize); } return ptr; }
/* * Make the ideal footprint equal to the current footprint. */ static void snapIdealFootprint() { HS_BOILERPLATE(); setIdealFootprint(getSoftFootprint(true)); }