Может ли программа Java обнаружить, что она работает на куче?

Я буду запускать генетический алгоритм на моем компьютере соседа по комнате в течение всех выходных дней, и я боюсь, что на такой длительный срок может закончиться память. Тем не менее, мой алгоритм работает таким образом, что было бы разумно легко обрезать менее полезные результаты, поэтому, если бы был способ сказать, когда моя программа вот-вот выйдет из кучи, я, вероятно, мог бы освободить место и продолжать еще некоторое время.

Есть ли способ получить уведомление, когда JVM заканчивается из пространства кучи, перед OutOfMemoryError?

4 ответа

Вы можете зарегистрировать javax.management.NotificationListener, который вызывается при достижении определенного порога.

Что-то вроде

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);
 }
}
</memorypoolmxbean>

Где слушатель - это ваша собственная реализация NotificationListener.


Вы можете попробовать следующее:

// 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();

Как найдено здесь - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html


Просто используйте WeakReferences для отбрасываемых результатов, затем они будут отброшены, если необходимо, по соображениям пространства.


Я не уверен в этом, но не могу JConsole решить вашу цель

licensed under cc by-sa 3.0 with attribution.