2012-07-20 48 views
18

Tengo un problema con la memoria del montón de Java. Desarrollé una aplicación de servidor cliente en Java que se ejecuta como un servicio de Windows, requiere más de 512 MB de memoria. Tengo 2 GB de RAM, pero cuando ejecuto mi aplicación lanza una excepcióncómo aumentar la memoria del montón de Java permanentemente?

Out of memory error:java heap space

pero ya he establecido tamaño de la pila (máximo de 512 MB) en el panel de control de Java y todavía conseguir el mismo error. No puedo establecer el tamaño del almacenamiento dinámico a través de la línea de comando porque mi aplicación se ejecuta como un servicio de Windows, entonces, ¿cómo puedo aumentar el tamaño de almacenamiento dinámico predeterminado?

+1

Los ajustes en el panel de control sólo afectan a los applets y aplicaciones Java Web Start por lo que no tendría ningún efecto en su aplicación. – assylias

+0

¿Cómo está ejecutando Java como un servicio de Windows? Normalmente, la utilidad que esté utilizando para hacer esto le permite especificar argumentos de línea de comando. –

Respuesta

-3

Tenga en cuenta que el aumento del tamaño del montón de Java tras un java.lang.OutOfMemoryError: Java heap space es bastante a menudo sólo una solución a corto plazo.

Esto significa que incluso si aumenta el tamaño predeterminado del almacenamiento dinámico de Java de 512 MB a 2048 MB, aún puede obtener este error en algún momento si se trata de una pérdida de memoria. La pregunta principal es ¿por qué está obteniendo este error OOM en primer lugar? ¿Es realmente un valor de Xmx demasiado bajo o simplemente un síntoma de otro problema?

Al desarrollar una aplicación Java, siempre es crucial entender desde un principio su requisito de huella de memoria estática y dinámica, esto ayudará a evitar problemas OOM complejos más adelante. El tamaño correcto de JVM Xms & Los ajustes de Xmx se pueden lograr a través de un perfil de aplicación adecuado y pruebas de carga.

+29

Si bien lo que dices no está mal, esta no debería ser la respuesta aceptada porque no responde en absoluto a la pregunta del OP. – searchengine27

+1

Sí, esta "respuesta" omite por completo la posibilidad de que el usuario desee ejecutar trabajos regularmente que requieren grandes cantidades de datos en la memoria ... nada que ver con las pérdidas de memoria. –

2

si necesita aumentar la memoria reservada, hay parámetros VM -Xms y -Xmx, uso, por ejemplo, -Xms512m -Xmx512m. También hay -XX parámetro: MaxPermSize = 256m que cambia de memoria reservada para la generación permanente

Si la aplicación se ejecuta como servicio de Windows, en los paneles de control -> Herramientas de administración -> Servicios se pueden agregar algunos parámetros de ejecución para su servicio

+0

puedo establecer variables de entorno como esta "JAVA_OPT = -Xms512m -Xmx512m" –

+0

no estoy seguro de esto, nunca lo intenté. Si lo intenta, publique aquí el resultado;) He actualizado mi publicación, puede agregar algunos parámetros al servicio de Windows –

+2

La variable de entorno JAVA_OPTS es típicamente específica del script que está ejecutando (como los scripts de inicio de tomcat). No puede suponer que tendrá ningún efecto. Use _JAVA_OPTIONS como se menciona a continuación. Funciona en Windows y Linux, siempre que esté utilizando el oráculo proporcionado jvm. No hay garantía de que funcione en JRockit o IBM jvm. – Matt

31

Java Virtual Machine toma dos argumentos de línea de comando que establecen los tamaños de montón inicial y máximo: -Xms y -Xmx. Puede agregar una variable de entorno del sistema llamada _JAVA_OPTIONS y establecer los valores de tamaño de pila allí.
Por ejemplo, si desea un máximo inicial y 1024Mb tamaño de la pila de 512 Mb que puede usar:

bajo Windows:

SET _JAVA_OPTIONS = -Xms512m -Xmx1024m 

bajo Linux:

export _JAVA_OPTIONS="-Xms512m -Xmx1024m" 

Es posible leer el valor por defecto Tamaño de almacenamiento dinámico de JVM mediante programación utilizando el método totalMemory() de la clase Runtime. Use el siguiente código para leer el tamaño del almacenamiento dinámico de JVM.

public class GetHeapSize { 
    public static void main(String[]args){ 

     //Get the jvm heap size. 
     long heapSize = Runtime.getRuntime().totalMemory(); 

     //Print the jvm heap size. 
     System.out.println("Heap Size = " + heapSize); 
    } 
} 
+2

En la exportación de Linux _JAVA_OPTIONS = "..." funciona. Para verificar: 'java -version' La primera línea debe informar las opciones, por ejemplo:' Recogido _JAVA_OPTIONS: -Xms512m -Xmx2048m'. – rickfoosusa

+0

No estoy seguro de por qué esto es así, pero Java VM nunca podría lanzarse para mí con múltiples opciones de almacenamiento dinámico (inicial y máximo). Solo con 1 opción en '_JAVA_OPTIONS' –

+0

thanku :) ¡una pequeña explicación ayudó mucho! –

1

Esto funcionó para mí:

_JAVA_OPTIONS exportación = "-" Xmx1g

Es importante que usted no tiene espacios porque para mí no funcionó. Yo sugeriría simplemente copiar y pegar.Entonces me encontré:

-XshowSettings java vm:

y le dirá:

Recogió _JAVA_OPTIONS: -Xmx1g

Cuestiones relacionadas