Qual è la dimensione massima di heap predefinita per JVM di Sun da Java SE 6?

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?