2011-05-27 13 views
7

¿Hay alguna característica entregada en Java que notifique una escasez de memoria en una aplicación (o notifique que ha alcanzado un nivel predefinido)?Notificación de falta de memoria en Java

Me preguntaba si era posible registrar un oyente (o algo equivalente) en alguna parte? Sé sobre los métodos de memoria en la clase Runtime. Podría crear una tarea programada comprobando la memoria restante, pero me pregunto si ya existe una solución.

No lo creo, pero estoy buscando una confirmación.

para los registros

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); 
NotificationEmitter emitter = (NotificationEmitter) mbean; 
NotificationListener listener = new NotificationListener() { 

    @Override 
    public void handleNotification(Notification notif, Object handback) { 

     String notifType = notif.getType(); 
     if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED) || 
      notifType.equals(MemoryNotificationInfo.MEMORY_COLLECTION_THRESHOLD_EXCEEDED)) { 

      // Retrieve the memory notification information 
      CompositeData cd = (CompositeData) notif.getUserData(); 
      MemoryNotificationInfo info = MemoryNotificationInfo.from(cd); 
      MemoryUsage mu = info.getUsage(); 

      System.out.println("Maximum memory = " + mu.getMax()); 
      System.out.println("Used memory = " + mu.getUsed()); 

     } 
    } 

}; 

emitter.addNotificationListener(listener, null, null); 
+0

+1 para publicar su código! – Andy

+0

@Andy Eso es lo que paso de leer a través del Javadoc. No completamente probado, pero la idea está ahí .... – JVerstry

Respuesta

5

Creo que se puede configurar un detector para un umbral de uso de memoria mediante el MemoryMXBean. El código de muestra se proporciona en el enlace javadoc.

+1

+1 Iba a sugerir un 'try' /' catch' en un 'OutOfMemoryError' con algunas medidas de seguridad, pero la gente siempre se queja de mí por mencionarlo la 'herejía' de atrapar un 'Error'. ;) –

+0

@Andrew Estaba pensando en sugerir lo mismo, pero luego vi la respuesta de @Andy. +1 para esta respuesta. – bacchus

+1

@Andrew, es posible detectar 'OutofMemoryError' (y lo he hecho antes), pero manejar el' Error' bien sin interrumpir el flujo del programa es bastante difícil. – notnoop

Cuestiones relacionadas