Aumento della dimensione massima dell’heap JVM per le applicazioni ad uso intensivo di memoria

Ho bisogno di eseguire un’applicazione di memoria Java intensiva che usi più di 2 GB, ma ho problemi ad aumentare la dimensione massima dello heap. Finora, ho provato i seguenti approcci:

C’è un altro approccio che posso provare ad aumentare la dimensione massima dell’heap della JVM? Ecco un riassunto 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) 

Ottieni una JVM a 64 bit da Oracle .

Quando si utilizza JVM in modalità a 32 bit, la dimensione massima dell’heap che è ansible allocare è 1280 MB. Quindi, se vuoi andare oltre, devi invocare JVM in modalità 64.

È ansible utilizzare seguenti:

 $ java -d64 -Xms512m -Xmx4g HelloWorld 

dove,

  • -d64: abiliterà la JVM a 64 bit
  • -Xms512m: imposterà la dimensione heap iniziale come 512 MB
  • -Xmx4g: imposterà le dimensioni massime dell’heap come 4 GB

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

Un’ottima risorsa per l’ottimizzazione delle prestazioni di JVM, che potrebbe voler esaminare: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

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.

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

Domande frequenti sull’heap a 32 bit di Oracle

Citazione

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

Qui sotto 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 "[email protected]"