2009-09-18 9 views
5

Me gustaría restringir el tamaño máximo de almacenamiento dinámico para una aplicación Java, pero parece que no funciona . Estoy ejecutando la aplicación desde un paquete jar a través de bat en Windows. Contenido del bate:Cómo restringir el uso de memoria de la aplicación Java empaquetada en un contenedor (-Xmx no parece funcionar) en Windows

@Echo off 
set CLASSPATH=. 
java -Xmx32m -classpath %CLASSPATH% -jar MyApplication.jar 

Esto debería restringir el tamaño máximo de almacenamiento dinámico de 32 megabytes. Sin embargo, cuando hago cosas que consumen memoria con la aplicación, el Administrador de tareas de Windows muestra que el consumo de memoria va al menos a unos 70 megabytes ... Incluso probé con -Xmx2m pero eso no hizo ninguna diferencia.

Por lo tanto, no estoy totalmente seguro de cuál es el problema. Por supuesto, hay una pila contenida en el uso de la memoria, pero la memoria utilizada por el programa debe ser mayormente el espacio en montón ...

La versión de Java parece ser 1.6.0_14.

Para aquellos interesados ​​en lo que estoy buscando, estoy tratando de ver cómo se comportaría mi aplicación con ciertas funciones cuando se agote el espacio de almacenamiento dinámico.

EDITAR: Hmm ... Me sorprendió que el uso del montón se limitara a los 32M en realidad cuando se monitorea con JConsole. Tengo que conseguir más memoria utilizada ...

Gracias por las ideas, Touko

Respuesta

5

No creo administrador de tareas muestra la pila de memoria específica. Incluye toda la memoria que el programa está usando en ese momento.

Para analizar memoria de pila, puede usar un generador de perfiles (como Yourkit) y ver si se cumple o no el límite de pila -Xmx. Esto también lo ayudará a analizar las partes del programa que le interesan.

+0

Sí, he comprobado la consola y el límite del montón fue hecho obedecía, la diferencia entre el espacio del montón y otra el uso de memoria era diferente de lo que esperaba. Con 20M logré obtener .OutOfMemoryError: Java montón de espacio – Touko

5

Ummm ... no funciona exactamente de esa manera.

Si bien existe una relación entre -Xmx32m y lo que ve en el administrador de tareas, no es uno a uno. Comprenda que el Administrador de tareas no informa su tamaño de almacenamiento dinámico, sino toda la memoria consumida por la JVM, cuyo código es solo un subconjunto.

+0

Sí, en teoría, sabía que, no esperaba que la diferencia fuera tan grande. – Touko

+0

Puede ser enorme. Acabo de publicar una pregunta sobre eso hoy ... ¡mi servidor JVM consume 3 veces el tamaño máximo de almacenamiento dinámico! –

2

Pruebe a configurar -Xmx128 y vea si obtiene un OutOfMemoryError. Esto debería confirmar que al menos se está configurando.

0

Quizás no esté usando realmente tanta memoria, pero la JVM está tirando de bibliotecas externas y cosas así.

Para probar esta teoría, puede usar la clase Runtime para ver la memoria total y la memoria utilizada.

3

Usted está viendo la suma del tamaño del montón & generación permanente. Puede ajustar el tamaño de la permanente con el argumento de línea de comandos -XX: MaxPermSize. Por ejemplo, esto lo establecerá en 128 m.

java -Xmx32m -XX:MaxPermSize=128m ... 
+0

Ha olvidado mencionar la memoria que consume la JVM. No es trivial. –

Cuestiones relacionadas