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());
}
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 :) –