/* * Sets the maximum number of bytes that the heap source is allowed * to allocate from the system. Clamps to the appropriate maximum * value. */ static void setIdealFootprint(size_t max) { HS_BOILERPLATE(); HeapSource *hs = gHs; size_t maximumSize = getMaximumSize(hs); if (max > maximumSize) { LOGI_HEAP("Clamp target GC heap from %zd.%03zdMB to %u.%03uMB", FRACTIONAL_MB(max), FRACTIONAL_MB(maximumSize)); max = maximumSize; } /* Convert max into a size that applies to the active heap. * Old heaps will count against the ideal size. */ size_t overhead = getSoftFootprint(false); size_t activeMax; if (overhead < max) { activeMax = max - overhead; } else { activeMax = 0; } setSoftLimit(hs, activeMax); hs->idealSize = max; }
/* * 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); }
/* * Make the ideal footprint equal to the current footprint. */ static void snapIdealFootprint() { HS_BOILERPLATE(); setIdealFootprint(getSoftFootprint(true)); }