2015-02-02 13 views
38

In the oracle documentation ho trovato:predefinito Xmxsize in Java 8

-Xmxsize Specifica la dimensione massima (in byte) del pool di allocazione di memoria in byte ... Il valore predefinito viene scelto in runtime basato sul sistema configurazione.

Cosa significa la configurazione di sistema ?

+1

Significa che se il sistema dispone di 16 GB di RAM, la dimensione sarà maggiore rispetto a 512 MB. –

+0

Grazie, quanto più grande? – Vitaly

+0

Cerca "dimensione massima heap" [qui] (http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html) – alfasin

risposta

80

Varia a seconda dell'implementazione e della versione, ma in genere dipende dalla VM utilizzata (ad esempio client o server, vedere i parametri -client e -server) e nella memoria di sistema.

Spesso il suo valore predefinito è 1/4 della memoria fisica o 1 GB (a seconda del valore minore).

Anche le opzioni di configurazione Java (parametri della riga di comando) possono essere "esternalizzate" a variabili di ambiente incluso lo -Xmx, che può modificare l'impostazione predefinita (ovvero specificare un nuovo valore predefinito). In particolare la variabile di ambiente JAVA_TOOL_OPTIONS viene controllata da tutti gli strumenti Java e utilizzata se esiste (ulteriori dettagli here e here).

è possibile eseguire il seguente comando per visualizzare i valori predefiniti:

java -XX:+PrintFlagsFinal -version 

Ti dà un elenco moooolto, -Xmx è in MaxHeapSize, -Xms è in InitialHeapSize. Filtra l'output (ad esempio |grep su linux) o salvalo in un file per poterlo cercare.

+3

Come piccola aggiunta, è possibile eseguire 'java -XX: + PrintCommandLineFlags' per stampare le dimensioni heap (e altre informazioni) scelte dalla JVM in base alle informazioni di sistema correnti –

+0

@CristianVat Sì, ma il parametro è' -XX: + PrintFlagsFinal', quello che hai suggerito non funziona per me. Aggiungendolo alla risposta – icza

+0

Giusto, mi dispiace '-XX: + PrintFlagsFinal' è l'opzione migliore in quanto dovrebbe mostrare tutte le informazioni dopo che tutto è stato preso in considerazione (comprese le opzioni manuali e l'ergonomia). Anche se '-XX: + PrintCommandLineFlags' sembra funzionare sulla mia JVM (potrebbe dipendere dalla versione esatta) –

8

Sorprendentemente questa domanda non ha una risposta definitiva documentata. Forse un altro punto dati fornirebbe valore agli altri in cerca di una risposta. Nei miei sistemi che eseguono CentOS (6.8.7.3) e Java 8 (build 1.8.0_60-b27, 64-Bit Server):

la memoria predefinita è 1/4 di memoria fisica, non limitata da 1 GB.

Inoltre, -XX:+PrintFlagsFinal stampe a STDERR in modo comando per determinare la memoria predefinita corrente presentato da altri di cui sopra dovrebbe essere ottimizzato per le seguenti:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize 

Di seguito è tornato su un sistema con 64 GB di RAM fisica:

uintx MaxHeapSize         := 16873684992  {product} 
+0

Nel mio sistema con 16 Gb di RAM: 2069889024 = 2 Gb. –

+0

Windows 7 64 bit con 8 GB di RAM: JVM a 32 bit: 256 MB, JVM a 64 bit: 2 GB – golimar

14

Come già accennato, l'impostazione predefinita -Xmxsize (Maximum HeapSize) dipende dalla configurazione del sistema.

Java8 prende ingrandita di 1/6th della vostra memoria fisica per il vostro Xmssize (HEAPSIZE Minimo) e più piccolo di 1/4 di memoria fisica per il vostro -Xmxsize (HEAPSIZE Massimo).

che significa che se si dispone di una memoria fisica di 8 GB di RAM, avrete Xmssize come ingrandita di 8 * (1/6) e più piccolo di -Xmxsize come 8 * (1/4).

Potete controllare il vostro HEAPSIZE default con

In di Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize" 

In Linux:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' 

Questi valori predefiniti possono essere overrided al vostro quantità desiderata

+0

Riferimento: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel. html # default_heap_size – kisna