Aumentar el tamaño de almacenamiento dinámico máximo de JVM para aplicaciones que requieren mucha memoria

88

Necesito ejecutar una aplicación Java con uso intensivo de memoria que utilice más de 2 GB, pero tengo problemas para aumentar el tamaño máximo del montón. Hasta ahora, he probado los siguientes enfoques:

  • Configuración del parámetro -Xmx, por ejemplo, -Xmx3000m. Este enfoque falla en la creación de la JVM. Por lo que busqué en Google, parece que -Xmx debe tener menos de 2 GB.

  • Usando la opción -XX: + AggressiveHeap . Cuando intento este método, aparece un error de "Memoria insuficiente" que indica que el tamaño del montón es 1273,4 MB, aunque mi computadora tiene 8 GB de memoria.

¿Existe otro enfoque que pueda intentar para aumentar el tamaño máximo de pila de la JVM? Aquí hay un resumen de las especificaciones de la computadora:

  • SO: Windows 7 (64 bits)
  • Procesador: Intel Core i7 (2,66 GHz)
  • Memoria: 8 GB
  • versión java:
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)
Alceu Costa
fuente
7
Por cierto: el tamaño de memoria mínimo y máximo ahora son opciones estándar. Puede utilizar -ms y -mx en lugar de -Xms y -Xmx. -¿¿X?? está reservado para opciones no estándar.
Peter Lawrey
2
¿Estándar para qué JVM? Todavía no son estándar para HotSpot JVM (a partir de 1.8). Ver docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle
-mx y -ms existen y funcionan, pero no puedo encontrarlo en la documentación oficial de Java @PeterLawrey> ¿puedes agregar un enlace a la documentación? Gracias
Michal Bernhard
2
@MichalBernhard es compatibilidad con versiones anteriores de Java 1.1. Lo vi documentado para esa versión, pero podría ser difícil de encontrar ahora. ;)
Peter Lawrey
1
Gracias @PeterLawrey por una explicación. Pero cuando dice que ahora es estándar, ¿quiere decir que es estándar de Java 1.1 (pero no documento en versiones posteriores)? Parece extraño :) por cierto, encontré un enlace en la documentación de Java 1.1 y tienes razón: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Respuestas:

47

Consiga una JVM de 64 bits de Oracle .

Presidente James K. Polk
fuente
1
Funcionó para mí :-) Ejecutando la aplicación usando -Xmx4g y sin problemas hasta ahora.
Alceu Costa
96

Cuando utiliza JVM en modo de 32 bits, el tamaño de almacenamiento dinámico máximo que se puede asignar es 1280 MB. Entonces, si desea ir más allá, debe invocar JVM en modo 64.

Puede utilizar lo siguiente:

$ java -d64 -Xms512m -Xmx4g HelloWorld

dónde,

  • -d64: habilitará JVM de 64 bits
  • -Xms512m: establecerá el tamaño de pila inicial en 512 MB
  • -Xmx4g: establecerá el tamaño máximo de pila en 4 GB

Puede sintonizar -Xms y -Xmx según sus requisitos (YMMV)

Un recurso muy bueno sobre el ajuste del rendimiento de JVM, que quizás desee consultar: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

mohitsoni
fuente
Mi JVM es de 32 bits y permite un máximo de -Xmx1024M. También voy a probar la versión de 64 bits.
Kiltek
Probé JVM de 64 bits y funcionó perfectamente. Ahora puedo establecer 4096 MB de tamaño de pila máximo. Cuando tenga instalados 32 y 64 bits, al menos en Windows, debe apuntar la ruta de Java para sus aplicaciones a la nueva versión de 64 bits instalada. De lo contrario, el error persistirá. En Windows, esto a menudo se puede hacer cambiando la ruta de Java en las Variables de entorno del sistema.
Fabiano
Supongo que el límite para el montón máximo no es 1280, sino algo cercano a 1700 MB. Usé 1600 MB de montón máximo en mi instalación de JVM de 32 bits y funcionó bien.
Fabiano
¿Cuál es el argumento HelloWorld en su comando? ¿Cómo puedo usar este comando si quiero establecer el máximo de un proceso Java que se inicia con el comando java -jar myApp.jar en linux?
LordScone
Hola, ¿puedo preguntar cuál es el tamaño máximo de almacenamiento dinámico de Java que puedo configurar? Cuando ejecuto la aplicación, el valor predeterminado -Xmx en mi máquina es de 4 GB, pero ¿puedo configurarlo en más de 4 GB?
Ock
14

Creo que el límite de 2 GB es para Java de 32 bits. Pensé que la v1.6 era siempre de 64 bits, pero intente forzar el modo de 64 bits solo para ver: agregue la opción -d64.

GRAMO__
fuente
La opción -D64 no funcionó, intentaré usar la JVM de 64 bits como sugirió GregS e informaré los resultados.
Alceu Costa
1
Los modificadores -d64 y -d32 funcionan correctamente solo en Solaris (al menos de acuerdo con esta documentación): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach
Probé con ambas opciones. Con -d64, la JVM no se inicia incluso si no especifico la opción Xmx. El -D64 solo funciona cuando no especifico el Xmx.
Alceu Costa
@Lukasz -d64 y -d32 también parecen funcionar en la JVM de Apple. Pero ese documento parece implicar que no son funcionales para las JVM de Windows y Linux de Sun.
G__
8

Java de 32 bits está limitado a aproximadamente 1,4 a 1,6 GB.

Preguntas frecuentes sobre el montón de Oracle de 32 bits

Citar

El límite de montón teórico máximo para la JVM de 32 bits es 4G. Debido a varias restricciones adicionales, como el intercambio disponible, el uso del espacio de direcciones del kernel, la fragmentación de la memoria y la sobrecarga de la VM, en la práctica, el límite puede ser mucho menor. En la mayoría de los sistemas Windows modernos de 32 bits, el tamaño máximo del montón oscilará entre 1,4G y 1,6G. En los kernels Solaris de 32 bits, el espacio de direcciones está limitado a 2G. En los sistemas operativos de 64 bits que ejecutan la máquina virtual de 32 bits, el tamaño máximo de pila puede ser mayor, acercándose a 4G en muchos sistemas Solaris.

Jean B
fuente
4

A continuación, conf funciona para mí:

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 "$@"
tutorialbyejemplo
fuente