2012-03-16 17 views
9

Voy a ejecutar un algoritmo genético en la computadora de mi compañero de cuarto durante todo el fin de semana, y me temo que podría agotarse la memoria en un plazo tan largo. Sin embargo, mi algoritmo funciona de tal manera que sería bastante fácil recortar los resultados menos útiles, por lo que si hubiera una manera de saber cuándo mi programa está a punto de quedarse sin espacio en el montón, probablemente podría dejar espacio y seguir adelante. algo más de tiempo.¿Puede un programa Java detectar que se está agotando en el espacio de almacenamiento dinámico?

¿Hay alguna manera de recibir notificaciones cuando la JVM se está quedando sin espacio libre, antes del OutOfMemoryError?

+0

posible duplicado de [¿Cómo controlar dinámicamente el tamaño del montón de Java?] (Http://stackoverflow.com/questions/2163228/how-to-dynamically-monitor-java-heap-size) –

+0

@Andreas_D, esta cuestión se trata sobre el monitoreo externo del programa. Quiero que mi propio programa reaccione cuando esté a punto de quedarse sin espacio en el montón. – zneak

+0

las respuestas a la otra pregunta incluyen soluciones de monitoreo interno y externo. –

Respuesta

6

Puede registrar un javax.management.NotificationListener que se invoca cuando se alcanza un cierto umbral.

Algo así como

final MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); 
final NotificationEmitter ne = (NotificationEmitter) memBean; 

ne.addNotificationListener(listener, null, null); 

final List<MemoryPoolMXBean> memPools = ManagementFactory 
    .getMemoryPoolMXBeans(); 
for (final MemoryPoolMXBean mp : memPools) { 
    if (mp.isUsageThresholdSupported()) { 
    final MemoryUsage mu = mp.getUsage(); 
    final long max = mu.getMax(); 
    final long alert = (max * threshold)/100; 
    mp.setUsageThreshold(alert); 

    } 
} 

Dónde oyente es su propia implementación de NotificationListener.

+0

Eso se parece mucho a lo que yo quisiera. Lo probaré. – zneak

+0

Utilizo este enfoque en http://code.google.com/p/pitestrunner/ si desea un ejemplo. Busque la clase MemoryWatchdog y es utilizada por MutationTestSlave. – henry

+0

No olvide agregar un filtro al suscribirse, es decir: Filtro de notificación Filtro = x -> MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED.equals (x.getType()); ne.addNotificationListener (tryPreventOom, filter, null); –

3

Puede probar esto:

// Get current size of heap in bytes 
long heapSize = Runtime.getRuntime().totalMemory(); 

// Get maximum size of heap in bytes. The heap cannot grow beyond this size. 
// Any attempt will result in an OutOfMemoryException. 
long heapMaxSize = Runtime.getRuntime().maxMemory(); 

// Get amount of free memory within the heap in bytes. This size will increase 
// after garbage collection and decrease as new objects are created. 
long heapFreeSize = Runtime.getRuntime().freeMemory(); 

Como se encuentra aquí - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html

+0

Supongo que esto podría constituir un truco correcto, pero prefiero que se me notifique automáticamente cuando se cumple un determinado umbral, en lugar de tener que sondear el estado de la memoria en un intervalo determinado (algo así como las notificaciones de memoria en iOS). – zneak

+0

No tengo conocimiento de ninguna otra forma de recibir notificaciones automáticamente en función de un umbral determinado, a menos que escriba un sondeador para hacer esto en segundo plano. – Nikhil

1

sólo tiene que utilizar WeakReferences de los resultados descartables, entonces ellos serán descartados si es necesario por razones de espacio.

+0

No puedo dejarlo a la discreción de GC, ya que necesito revisar los objetos antes de decidir que sean eliminable. – zneak

+0

+1: O use SoftReferences que son de mayor duración, WeakReference siempre se descartan en un GC. Puede mantener una ReferenceQueue para recibir notificaciones de objetos que podrían limpiarse. –

0

No estoy seguro de esto, pero no puede JConsole resolver su objetivo ??

Cuestiones relacionadas