Qual è la dimensione massima dell’heap predefinita per JVM di Sun da Java SE 6 (equivalente all’impostazione -Xmx)?
Sembra per Java SE 5 con una macchina server-class, è così
Più piccolo di 1/4 della memoria fisica o 1 GB.
Domanda bonus: sembra che per JVM di IBM puoi chiederlo
java -verbose:sizes -version
Puoi chiedere allo stesso modo Sun’s JVM?
Modifica :
Ho usato Runtime.getRuntime (). MaxMemory per confermare min (memoria fisica / 4, 1G), a cui si fa riferimento nella documentazione di Sun.
java 1.6.0_21 o successivo, o così …
$ java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize uintx MaxHeapSize := 12660904960 {product}
Sembra che il min (1G) sia stato rimosso.
O su Windows usando findstr
C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
Si può chiedere con un po ‘di codice Java:
long maxBytes = Runtime.getRuntime().maxMemory(); System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M");
Vedi javadoc .
Con JDK, puoi anche utilizzare jinfo per connetterti alla JVM per
in questione e ottenere il valore per MaxHeapSize:
jinfo -flag MaxHeapSize
A partire da JDK6U18 seguenti sono le configurazioni per la dimensione heap.
Nella JVM del client, la configurazione dell’heap Java predefinita è stata modificata per migliorare le prestazioni delle attuali applicazioni rich client. Le dimensioni iniziali e massime dell’heap sono maggiori e le impostazioni relative alla garbage collection generazionale sono ottimizzate.
La dimensione massima di heap predefinita è metà della memoria fisica fino a una memoria fisica di 192 megabyte e un quarto della memoria fisica fino a una memoria fisica di 1 gigabyte. Ad esempio, se la tua macchina ha 128 megabyte di memoria fisica, allora la dimensione massima dell’heap è 64 megabyte, e maggiore o uguale a 1 gigabyte di memoria fisica si traduce in una dimensione massima dell’heap di 256 megabyte. La dimensione massima dell’heap non è effettivamente utilizzata da JVM a meno che il tuo programma non crei abbastanza oggetti da richiederlo. Una quantità molto più piccola, denominata la dimensione iniziale dell’heap, viene allocata durante l’inizializzazione JVM. Questa quantità è di almeno 8 megabyte e in altri casi 1/64 della memoria fisica fino a una dimensione di memoria fisica di 1 gigabyte.
Fonte: http://www.oracle.com/technetwork/java/javase/6u18-142093.html
un modo è se hai un jdk installato, nella cartella bin c’è un’utilità chiamata jconsole (anche si può usare visualvm). Lanciarlo e connettersi al relativo processo java e puoi vedere quali sono le impostazioni della dimensione dell’heap impostate e molti altri dettagli
Quando si esegue solo headless o cli, jConsole può essere utilizzato su LAN, se si specifica una porta su cui connettersi all’avvio del servizio in questione.
Per rispondere a questa domanda è fondamentale se la VM Java è in modalità CLIENT o SERVER. È ansible specificare le opzioni “-client” o “-server”. Altrimenti java usa regole interne; fondamentalmente win32 è sempre client e Linux è sempre server, ma vedi la tabella qui:
http://docs.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html
Sun / Oracle jre6u18 doc dice re client: la VM riceve 1/2 della memoria fisica se la macchina ha <= 192 MB; 1/4 di memoria se la macchina ha <= 1 Gb; max 256 Mb. Nel mio test su un sistema WindowsXP a 32 bit con mem fisico 2Gb, Java ha assegnato 256Mb, che concorda con il doc.
Sun / Oracle jre6u18 doc dice re server: uguale al client, quindi aggiunge un linguaggio confuso: per JVM a 32 bit il valore predefinito massimo è 1 Gb, mentre per JVM a 64 bit il valore predefinito è 32 Gb. Nel mio test su una macchina Linux a 64 bit con 8Gb fisici, Java alloca 2 GB, che è 1/4 di fisico; su una macchina Linux a 64 bit con 128 GB di memoria fisica, Java alloca 32 GB, di nuovo 1/4 di fisico.
Grazie a questo post SO per guidarmi:
La definizione della macchina server-class è cambiata di recente?