2010-06-12 16 views
69

Necesito ejecutar una aplicación con uso intensivo de memoria Java que utiliza más de 2 GB, pero estoy teniendo problemas para aumentar el tamaño máximo del almacenamiento dinámico. Hasta ahora, he intentado los siguientes enfoques:Aumento del tamaño máximo de almacenamiento dinámico de JVM para aplicaciones con uso intensivo de memoria

  • Configuración del parámetro -Xmx, p. -Xmx3000m. Este enfoque fracasa en la creación de la JVM. Por lo que he buscado en Google, parece que -Xmx debe tener menos de 2GB.

  • Usando el -XX:+AggressiveHeap option. Cuando intento este enfoque, aparece un error de "Falta de memoria suficiente" que indica que el tamaño del almacenamiento dinámico es de 1273,4 MB, aunque mi computadora tiene 8 GB de memoria.

¿Hay otro enfoque que pueda intentar aumentar el tamaño máximo de almacenamiento dinámico de la JVM? He aquí un resumen de las especificaciones informáticas:

  • SO: Windows 7 (64 bits)
  • Procesador: 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) 
+6

Por cierto: El tamaño mínimo y máximo de memoria son ahora las opciones estándar. Puede usar -ms y -mx en lugar de -Xms y -Xmx. -¿¿X?? está reservado para opciones no estándar. –

+1

Norma para la cual JVM? Todavía no son estándar para HotSpot JVM (a partir de 1.8). Ver http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI – Huckle

Respuesta

43

Consíguete una JVM de 64 bits de Oracle.

+1

Funcionó para mí :-) Ejecutando la aplicación usando -Xmx4g y sin problemas hasta el momento. –

14

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

+0

La opción -D64 no funcionó, intentaré usar la JVM de 64 bits como sugirió GregS e informar los resultados. –

+1

Los modificadores -d64 y -d32 funcionan correctamente solo en Solaris (al menos según esta documentación): http://java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering. –

+0

@Alceu usaste -D64 o -d64? Son diferentes ... – Greg

79

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

permite utilizar las siguientes:

$ java -d64 -Xms512m -Xmx4g HelloWorld 

donde,

  • -d64: permitirá a JVM de 64 bits
  • -Xms512m: estableceremos el tamaño inicial del almacenamiento dinámico como 512 MB
  • -Xmx4g: establecerá un tamaño máximo de almacenamiento dinámico como 4 GB

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

Un recurso muy bueno en la optimización del rendimiento de JVM, que puede ser que desee ver en: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

+0

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

+0

He probado JVM de 64 bits y funcionó perfectamente. Ahora puedo establecer 4096 MB de tamaño máximo de almacenamiento dinámico. Cuando tiene instalados tanto 32 como 64 bits, al menos en Windows necesita 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

+0

Supongo que el límite para el montón máximo no es 1280, sino algo cercano a 1700 MB. Utilicé 1600 MB de máximo almacenamiento dinámico en mi instalación JVM de 32 bits y funcionó bien. – Fabiano

8

32-bits de Java se limita a aproximadamente 1.4 a 1.6 GB.

Oracle 32 bit heap FAQ

Cita

El límite máximo del montón teórico para el 32-bit JVM es 4G.Debido a varias restricciones adicionales, como el intercambio disponible, el uso del espacio de direcciones del núcleo, la fragmentación de la memoria y la sobrecarga de VM, en la práctica el límite puede ser mucho menor. En la mayoría de los sistemas modernos de Windows de 32 bits, el tamaño máximo del almacenamiento dinámico variará de 1.4G a 1.6G. En kernels de Solaris de 32 bits, el espacio de direcciones está limitado a 2G. En los sistemas operativos de 64 bits que ejecutan la VM de 32 bits, el tamaño máximo de almacenamiento dinámico puede ser mayor, acercándose a 4G en muchos sistemas Solaris.

2

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 "[email protected]" 
Cuestiones relacionadas