Java程序可以检测到它在堆空间上运行不足吗?

时间:2012-03-16 05:35:35

标签: java memory

我将在我的室友的电脑上运行一个遗传算法整个周末,我担心它会在这么长时间内耗尽内存。但是,我的算法以这样的方式工作,这样可以很容易地减少不太有用的结果,所以如果有办法告诉我的程序什么时候用完了堆空间,我可能会腾出空间继续前进还有一段时间。

在OutOfMemoryError之前,有没有办法在JVM用完堆空间时收到通知?

4 个答案:

答案 0 :(得分:7)

您可以注册在达到特定阈值时调用的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);

  }
}

侦听器是您自己的NotificationListener实现。

答案 1 :(得分:3)

你可以试试这个:

// 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

答案 2 :(得分:2)

只需使用WeakReferences获取可丢弃的结果,如果出于空间原因,它们将被丢弃。

答案 3 :(得分:0)

我不确定这一点,但不能JConsole解决你的目的?