2012-04-18 14 views
6

Durante la creazione di profili di un'applicazione Java a 64 bit che presenta alcuni problemi, noto che lo stesso profiler (YourKit) utilizza quantità di memoria veramente colossali. Quello che ho nello script di lancio YourKit è:Stima della dimensione heap massima JVM sicura in Java a 64 bit

JAVA_HEAP_LIMIT="-Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m" 

Ingenuamente, assumendo un certo overhead, questo mi portano a immaginare che YourKit sta per utilizzare un massimo di qualcosa forse un po 'più di quattro GB. Tuttavia, ciò che ho fatto vedere in PS è:

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
dmoles 31379 4.4 68.2 14440032 8321396 ? Sl 11:47 10:42 java -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dyjp.probe.table.length.limit=20000 -Xbootclasspath/a:/home/dmoles/Applications/yjp-9.5.6/bin/../lib/tools.jar -jar /home/dmoles/Applications/yjp-9.5.6/bin/../lib/yjp.jar 

Questa è una dimensione virtuale di quasi il 14 GB e una dimensione residente di quasi l'8 GB - quasi 3 volte il heap Java.

Ora, ho abbastanza memoria sul mio box di sviluppo per eseguire questo, ma tornando al problema di memoria originale che sto cercando di diagnosticare: come faccio a sapere quanto mucchio di Java devo giocare?

Chiaramente, se il cliente ha, ad esempio, 16 GB di RAM fisica, non è una buona idea per me dire loro di impostare -Xmx su 16 GB.

Quindi cosa è un numero ragionevole? 12 GB? 8 GB?

E come posso stimarlo?

risposta

9

Chiaramente, se il cliente ha, diciamo, 16 GB di RAM fisica, non è una grande idea per me di dire loro di impostare -Xmx a 16 GB.

Se il cliente è in esecuzione non altro significativo sul suo/la sua macchina, quindi impostare la dimensione heap a 16G non è necessariamente una cattiva idea. Dipende da cosa sta facendo l'applicazione.

Quindi, qual è un numero ragionevole? 12 GB? 8 GB?

Il numero ideale sarebbe di avere "JVM max JVM spese generali non heap mucchio + + OS + altre applicazioni attive di lavoro sets + cache di buffer di lavoro impostato" aggiungere fino alla quantità di memoria fisica. Ma il problema è che nessuno di questi componenti (a parte la dimensione massima dell'heap) può essere bloccato senza misurazioni dettagliate sulla macchina del cliente ... mentre l'applicazione è in esecuzione sul problema reale.

E come si stima?

La linea di fondo è che non è possibile. Il meglio che puoi fare è indovinare ... ed essere prudenti.

Un approccio alternativo consiste nel valutare la quantità di heap effettivamente necessaria per il problema che sta tentando di risolvere. Quindi aggiungi un 50 o 100 percento in più per consentire alla sala GC di funzionare in modo efficiente. (E poi sintonizzare ...)

+0

+1 per dire che è una buona idea stimare quanto heap l'applicazione richiede e passare da lì. La domanda "come faccio a stimarla" mi ricorda il post di Eric Lippert su [la tragedia della felicità del filo] (http://blogs.msdn.com/b/ericlippert/archive/2004/02/15/the-tragedy- di-thread-felicità-disease.aspx). –

+0

@AdamMihalcin Ouch. :) –

+0

@AdamMihalcin È un buon consiglio, ma ci sono due lati della medaglia.Heads (stimando quanto l'applicazione ha bisogno) è "ecco quanti utenti ci aspettiamo, quanto server dovremmo comprare?" Tails è, "ecco quanti server abbiamo, quanti utenti dovremmo aspettarci di essere in grado di gestire prima che finisca la memoria?" –

Problemi correlati