Aumento della dimensione massima dell'heap della JVM per le applicazioni a uso intensivo di memoria


88

Devo eseguire un'applicazione Java ad alta intensità di memoria che utilizza più di 2 GB, ma ho problemi ad aumentare la dimensione massima dell'heap. Finora ho provato i seguenti approcci:

  • Impostazione del parametro -Xmx, ad esempio -Xmx3000m. Questo approccio fallisce nella creazione della JVM. Da quello che ho cercato su Google, sembra che -Xmx deve essere inferiore a 2 GB.

  • Utilizzando l' opzione -XX: + AggressiveHeap . Quando provo questo approccio ricevo un errore "Memoria insufficiente" che indica che la dimensione dell'heap è 1273,4 MB, anche se il mio computer ha 8 GB di memoria.

C'è un altro approccio che posso provare per aumentare la dimensione massima dell'heap della JVM? Ecco un riepilogo delle specifiche del computer:

  • Sistema operativo: Windows 7 (64 bit)
  • Processore: Intel Core i7 (2.66 GHz)
  • Memoria: 8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: la dimensione della memoria minima e massima ora sono opzioni standard. Puoi usare -ms e -mx invece di -Xms e -Xmx. -X?? è riservato alle opzioni non standard.
Peter Lawrey

2
Standard per quale JVM? Sono ancora non standard per HotSpot JVM (a partire da 1.8). Vedi docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx e -ms esistono e funzionano, ma non riesco a trovarli nella documentazione java ufficiale @PeterLawrey> puoi aggiungere un collegamento alla documentazione? Grazie
Michal Bernhard

2
@MichalBernhard è retrocompatibile con Java 1.1. L'ho visto documentato per quella versione ma potrebbe essere difficile da trovare ora. ;)
Peter Lawrey

1
Grazie @PeterLawrey per la spiegazione. Ma quando dici che ora è standard, intendi che è standard da Java 1.1 (ma non documento nelle versioni successive)? Sembra strano :) btw ho trovato il collegamento sulla documentazione di Java 1.1 e hai ragione: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Risposte:



96

Quando si utilizza JVM in modalità a 32 bit, la dimensione massima dell'heap che può essere allocata è 1280 MB. Quindi, se vuoi andare oltre, devi invocare JVM in modalità 64.

Puoi usare quanto segue:

$ java -d64 -Xms512m -Xmx4g HelloWorld

dove,

  • -d64: abiliterà la JVM a 64 bit
  • -Xms512m: imposterà la dimensione dell'heap iniziale su 512 MB
  • -Xmx4g: imposterà la dimensione massima dell'heap su 4 GB

Puoi sintonizzare -Xms e -Xmx secondo i tuoi requisiti (YMMV)

Un'ottima risorsa sull'ottimizzazione delle prestazioni di JVM, che potrebbe essere utile esaminare: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


La mia JVM è a 32 bit e consente un massimo di -Xmx1024M. Inoltre proverò la versione a 64 bit.
kiltek

Ho provato JVM a 64 bit e ha funzionato perfettamente. Ora posso impostare 4096 MB di dimensione massima dell'heap. Quando hai installato sia 32 che 64 bit, almeno su Windows devi puntare il percorso Java per le tue applicazioni alla nuova versione a 64 bit installata. In caso contrario, l'errore persisterà. Su Windows questo spesso può essere fatto cambiando il percorso Java nelle variabili d'ambiente del sistema.
Fabiano

Immagino che il limite per l'heap massimo non sia 1280, ma qualcosa vicino a 1700 MB. Ho usato 1600 MB di heap massimo sulla mia installazione JVM a 32 bit e ha funzionato bene.
Fabiano

qual è l'argomento HelloWorld nel tuo comando? come posso usare questo comando se voglio impostare il massimo di un processo Java che viene avviato con il comando java -jar myApp.jar su linux?
LordScone

Ciao, posso chiederti qual è la dimensione massima dell'heap java che posso impostare? Quando eseguo l'applicazione, il valore predefinito -Xmx sulla mia macchina è di 4 GB, ma posso impostarlo su un valore superiore a 4 GB?
Ock

14

Credo che il limite di 2 GB sia per Java a 32 bit. Pensavo che la v1.6 fosse sempre a 64 bit, ma prova a forzare la modalità a 64 bit solo per vedere: aggiungi l'opzione -d64.


L'opzione -D64 non ha funzionato, proverò a utilizzare la JVM a 64 bit come suggerito da GregS e riporterò i risultati.
Alceu Costa

1
Le opzioni -d64 e -d32 funzionano correttamente solo su Solaris (almeno secondo questa documentazione): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach

Ho provato con entrambe le opzioni. Con -d64 la JVM non si avvia anche se non specifico l'opzione Xmx. -D64 funziona solo quando non specifichi Xmx.
Alceu Costa

Anche @Lukasz -d64 e -d32 sembrano funzionare sulla JVM di Apple. Ma quel documento sembra implicare che non sono funzionali per le JVM di Sun per Windows e Linux.
G__

8

Java a 32 bit è limitato a circa 1,4-1,6 GB.

Domande frequenti sull'heap Oracle a 32 bit

Citazione

Il limite di heap teorico massimo per la JVM a 32 bit è 4G. A causa di vari vincoli aggiuntivi come lo scambio disponibile, l'utilizzo dello spazio degli indirizzi del kernel, la frammentazione della memoria e il sovraccarico della VM, in pratica il limite può essere molto più basso. Sulla maggior parte dei moderni sistemi Windows a 32 bit, la dimensione massima dell'heap varia da 1.4G a 1.6G. Sui kernel Solaris a 32 bit lo spazio degli indirizzi è limitato a 2G. Nei sistemi operativi a 64 bit che eseguono la VM a 32 bit, la dimensione massima dell'heap può essere maggiore, avvicinandosi al 4G su molti sistemi Solaris.


4

Di seguito conf funziona per me:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.