2012-03-27 38 views
9

Tengo una gran aplicación de Java que utiliza cantidades masivas de memoria a veces y me gustaría monitorear esto a intervalos para ver si se alcanzan los límites de acumulación o permgen o si se han acercado a ellos.Cómo imprimir el uso de la memoria Java jvm para depuración?

¿Cómo puedo imprimir las piezas más relevantes de la información de uso de la memoria usando java?

Respuesta

10

He aquí un fragmento de una pieza de código que tenemos que registra periódicamente el uso de la memoria de nuestra aplicación:

import java.lang.management.GarbageCollectorMXBean 
import java.lang.management.ManagementFactory 
import java.lang.management.MemoryPoolMXBean 
import java.lang.management.MemoryUsage 

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); 
log("Heap", ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()); 
log("NonHeap", ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()); 
List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans(); 
for (MemoryPoolMXBean bean: beans) { 
    log(bean.getName(), bean.getUsage()); 
} 

for (GarbageCollectorMXBean bean: ManagementFactory.getGarbageCollectorMXBeans()) { 
    log(bean.getName(), bean.getCollectionCount(), bean.getCollectionTime()); 
} 
1

Usted puede intentar VisualVM, un perfilador de Java que va con cada JDK. Lo encontrará en la carpeta "bin".

+0

Conozco VisualVM y lo he usado cuando estoy depurando activamente un problema mientras está sucediendo. Pero algunos problemas ocurren durante las carreras nocturnas, lo que significa que necesito iniciar sesión en algún lugar para procesarlos más tarde. Por supuesto, podría dejar abierta la aplicación VisualVM por la noche, pero no es la solución a largo plazo que estoy buscando, ya que los registros son permanentes y accesibles para todos los usuarios del sistema y no están vinculados a mi computadora :) –

Cuestiones relacionadas