2010-05-21 5 views
7

Quiero calcular el uso del montón para mi aplicación. Me gustaría obtener un valor aproximado de Hep size solo.¿Cómo obtener solo el tamaño de pila libre (no juntos w stack/method mem) en Java?

¿Cómo obtengo el valor en el código de la aplicación en ejecución actual?

EDITAR

había una respuesta upvoted que era NO completa/correcta. Los valores devueltos por esos métodos también incluyen área de pila y método, y debo monitorear solo el tamaño del montón.
Con ese código que tiene HeapError excepción cuando llegué a 43%, por lo que no puede utilizar estos métodos para controlar simplemente amontonar

Runtime.getRuntime().totalMemory() 

Respuesta

2

respuesta de dbyme no es correcta - estos llamadas en tiempo de ejecución le dan una cantidad de memoria utilizado por JVM, pero esta memoria no consiste solo en el montón, también hay área de pila y método, por ejemplo

+0

Esto es cierto. Obtengo un error de memoria Heap, cuando alcancé el 43% de uso. – Pentium10

+0

Buena llamada. Estoy realmente interesado en saber la respuesta correcta ahora. – dbyrne

1

Esta información está expuesta a través de la interfaz de administración JMX. Si simplemente desea verlo, JConsole o visualvm (parte del JDK, instalado en JAVA_HOME/bin) pueden mostrar buenos gráficos del uso de la memoria de una JVM, opcionalmente divididos en varios grupos de memoria.

Esta interfaz también se puede acceder mediante programación; ver MemoryMXBean.

+0

Como estoy en Android, no tengo acceso a esos. – Pentium10

+0

Intenta usar la interfaz directamente, entonces. Agregué un enlace para que comiences. – meriton

0

Realmente no hay buena respuesta, ya que la cantidad de memoria montón JVM tiene libre no es la misma que la cantidad de memoria montón el sistema operativo dispone de conexión, que son a la vez no es igual que la pila de memoria cuánto se puede asignar a su aplicación.

Esto se debe a que los montones de JVM y OS son diferentes. Cuando la JVM se queda sin memoria, puede ejecutar la recolección de elementos no utilizados, desfragmentar su propio montón o solicitar más memoria del sistema operativo. Como los objetos no utilizados no recolectados aún no existen, pero técnicamente son "gratuitos", hacen que el concepto de memoria libre sea un poco borroso.

También, fragmentos de la memoria del montón; cómo/cuándo/si la memoria se desfragmenta depende de la implementación de la JVM/OS. Por ejemplo, el almacenamiento en el sistema operativo puede tener 100 MB de memoria libre, pero debido a la fragmentación, el espacio contiguo disponible más grande puede ser de 2 MB. Por lo tanto, si la JVM solicita 3 MB, es posible que se produzca un error de falta de memoria, aunque aún estén disponibles 100 MB. No es posible que la JVM sepa de antemano que el sistema operativo no podrá asignar esos 3MB.

+0

¿Cómo puede detectar que su aplicación está en estado de ánimo crítico, llegando a ese nivel? – Pentium10

+0

@ Pentium10: [Inicie Java con un gran montón] (http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.%20Total%20Heap|outline), luego cuando desea verificar, ejecute el recolector de basura manualmente y verifique el espacio libre después. Diría que todo lo que esté por debajo del 40% es malo, pero como vieron, es posible quedarse sin memoria con aún más memoria libre que eso.Además, ejecutar el recolector de basura manualmente es * extremadamente * lento, y no es algo que quieras hacer en ninguna aplicación real. ¿Por qué estás haciendo esto? –

+0

Tengo un tipo de proceso de generación de back-tracking ejecutado en un dispositivo móvil Android, donde no puedo iniciar Java con un gran montón. Necesito detener el proceso de generación antes de que sea demasiado tarde. – Pentium10

1

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); bean.getHeapMemoryUsage(). GetUsed();

Cuestiones relacionadas