2009-10-05 15 views

risposta

16

Una JVM inizia in genere allocando un heap relativamente piccolo. Quindi, dopo l'esecuzione di ogni GC, controlla la quantità di memoria heap disponibile. Se il rapporto tra heap gratuito e heap totale è troppo piccolo, la JVM aggiungerà più memoria all'heap (fino alla dimensione massima di heap configurata).

Un secondo fatto rilevante è che GC funziona in modo più efficiente quando c'è molta memoria da recuperare. A condizione che non si eseguano i limiti complessivi delle risorse di sistema (ad esempio l'attivazione di paging o swapping), si ottengono prestazioni migliori delle applicazioni eseguendo con un heap di grandi dimensioni piuttosto che piccolo.

Supponiamo che lo scrittore dell'applicazione sappia che l'app ha probabilmente bisogno di una certa quantità di heap (ad es. 4Mb) per funzionare comodamente. Impostando tale dimensione come dimensione minima dell'heap significa che la JVM non ha bisogno di eseguire il GC quando l'heap si riempie (diciamo) di 1Mb, 2Mb e 3Mb. Di conseguenza, JVM esegue il garbage collector un minor numero di volte durante l'avvio dell'applicazione e durante il normale funzionamento, l'app si avvia più rapidamente e l'utente vede meno pause GC.

+1

Un profilatore può aiutare a stimare i requisiti iniziali di heap di avvio? –

+1

Non direttamente. Supponiamo di eseguire il profiler su uno snapshot eseguito quando l'applicazione è "avviata". Questo ti dice come gli oggetti esistono in quel punto, ma non 1) quale sia il set di lavoro massimo * durante * bootstrap, o 2) la quantità di memoria extra che verrà consumata quando l'applicazione inizia a fare cose. In breve, la dimensione del working set dopo il bootstrap potrebbe essere una stima scarsa. –

Problemi correlati