如何检测Java堆几乎已满并防止"OutOfMemoryError:Java堆"?

nei*_*zan 3 java heap-memory out-of-memory

在SO中有一些与"OutOfMemoryError:Java Heap"错误相关的问题,但是阅读它们,大多数人似乎都在讨论如何增加堆大小或分析应用程序以及检测内存泄漏.

我正在研究一个项目,它可以分析分支和绑定算法的成本.对于输入小输入大小,搜索的潜在解决方案数量在O(n!)处增长.在某个输入大小n时,我遇到了"OutOfMemoryError",因为parial解决方案保留在优先级队列中直到准备好被处理,并且队列中的大量部分解决方案填满了内存.所以,我知道我没有内存泄漏,我不一定想增加堆大小.

我想做的只是检测内存几乎已满,然后给用户一条消息,告诉他们发生了什么以及程序退出的原因(此时程序没有必要继续运行).有没有办法做到这一点?我看过这个java.lang.management包,但它对我来说没有多大意义,而且我很难找到合适的示例代码.任何解释或示例代码表示赞赏.

Thi*_*ilo 5

我想做的只是检测内存几乎已满,然后给用户一条消息,告诉他们发生了什么以及程序退出的原因(此时程序没有必要继续运行).

那很难.主要是因为在垃圾收集发生之前并不真正知道可用内存,并且严重的垃圾收集通常仅在您用完之前发生.

你能做的就是解释为什么程序在事后崩溃:Eclipse就是这样做的.您可以像任何其他Throwable一样捕获OutOfMemoryError,并显示您的消息:

 try{
      heavyLifting();
 }
 catch (OutOfMemoryError e){
    showAMessage();   
 }
Run Code Online (Sandbox Code Playgroud)

  • `heavyLifting()`是你的算法.我的建议是将整个程序包装到这个try/catch块中. (2认同)