2011-06-27 12 views
5

Estoy usando Eclipse. El problema es que mi aplicación falla si la memoria asignada es inferior a 512 MB. Ahora, ¿hay alguna manera de verificar la memoria disponible para un programa antes de iniciar el procesamiento exhaustivo de memoria pesada? Por ejemplo, sé que podemos comprobar disponibles tamaño de almacenamiento dinámico de JVM como:¿Comprobar disponible heapSize programmatically?

long heapSize = Runtime.getRuntime().totalMemory(); 
System.out.println("Heap Size = " + heapSize); 

El problema es que esto le da el tamaño del montón de JVM. Incluso aumentarlo no funciona usando Eclipse. En Eclipse, si cambio los argumentos de VM entonces funciona. Sin embargo, la impresión de las declaraciones anteriores es siempre la misma. ¿Hay algún comando a través del cual pueda saber exactamente cuánta memoria tengo asignada para una aplicación en particular?

+0

tal vez el problema es eclipse. ¿Has probado Netbeans o IntelliJ? – telm

+0

intenté, es el mismo resultado con cualquier IDE – Johnydep

+0

Runtime tiene bothMemory() y maxMemory(). maxMemory es más grande en mi experiencia. –

Respuesta

13

Puede usar JMX para recopilar el uso de la memoria del montón en tiempo de ejecución.


Ejemplo de código:

import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryType; 
import java.lang.management.MemoryUsage; 

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) { 
    if (mpBean.getType() == MemoryType.HEAP) { 
     System.out.printf(
      "Name: %s: %s\n", 
      mpBean.getName(), mpBean.getUsage() 
     ); 
    } 
} 

salida Ejemplo:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K) 
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K) 
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K) 

Si su tenga pregunta sobre "Espacio Edén" o "Supervivientes espacio", echa un vistazo a How is the java memory pool divided

+0

Sí, pero realmente ayuda. Solo quiero saber la memoria total asignada a mi aplicación por JVM o algo así. Desde la configuración, sé que si es menor a 512 MB, es suficiente. Pero, ¿cómo puedo comprobar esto pragmáticamente porque una vez que esta aplicación está empaquetada, si se bloquea en el tiempo de ejecución, debería haber una metodología para avisar al usuario sobre la naturaleza del error. En el peor de los casos, detectaré la excepción y le pediré al usuario que aumente el tamaño de la memoria, pero eso sería después del bloqueo, pero no antes del inicio. Desafortunadamente, demora unos 30 minutos antes de que falle y sería una pérdida de tiempo. – Johnydep

+0

¿Has configurado tus JAVA_OPTS o CATALINA_OPTS? ¿Qué pasa con el parámetro '-Xmx' (tamaño máximo de pila)? Tal vez se cuelga porque está fuera de la memoria en algún momento? ¿Qué dicen los archivos de registro, cualquier error de OutOfMemory? – Danijel

0

¿Qué tal esta idea? Puede consultar el JVM command line with this API.

Luego puede escanear la línea de comandos para los parámetros -Xmx… para asegurarse de que se haya especificado un montón suficientemente grande.