如何在代码中找到内存泄漏的地方?

时间:2016-06-07 04:31:45

标签: java memory-leaks out-of-memory

我如何抓住java.lang.OutOfMemoryError: Java heap space? 我有服务器,有时候工作,然后抛出java.lang.OutOfMemoryError: Java heap space。但是我不能在代码发生的地方晕倒。在日志中没有iformation它发生的地方。 我们分配了8 GB内存并且没有出现错误,但服务器在某个时间点开始占用几乎整个内存。 哪些工具可以帮助我找到错误?

我尝试过Visual JVM,但没有帮助。我不能在内存泄漏的地方晕倒

我无法模拟服务器崩溃时的情况

2 个答案:

答案 0 :(得分:1)

您可以使用JProfiler或VisualVM(还有许多其他工具,这里只提两个选项)来分析堆转储,以确定哪种对象占用的内存最多。这将让您了解应用程序中不同对象的实例数,内存消耗。通过它,您将能够找出发生内存泄漏的位置。

像JProfiler这样的工具允许您连接到正在运行的JVM实例并跟踪方法调用树,创建特定对象的代码位置等,这将与从堆转储中提取的上述详细信息相结合,为您提供更多关于发生内存泄漏的线索。

答案 1 :(得分:0)

java.lang.OutOfMemoryError: Java heap space

你一定不能抓住它。程序员不需要对这些做任何事情。实际上,对于错误使用try-catch子句是个坏主意。无法从错误中恢复。唯一的错误解决方案是终止执行。错误与运行应用程序的环境有关。示例包括OutOfMemoryError,StackOverflowError等

现在,如果您遇到此错误,则表示需要重新设计应用程序。

  1. 检查如果您的应用程序优雅地关闭所有资源,可能最终阻止或类似的事情。
  2. 检查您正在创建的对象。问问你的自己是否确实需要一次又一次地创建任何对象,它可以是一个单身,该对象的范围是什么 - 它是否是全局可访问的,该对象的生命是什么。
  3. 尽量减少对象的范围,我的意思是如果它非常重要,那么就可以使对象全局访问。
  4. 要分析堆转储,可以使用以下参数执行JVM:

    -XX:+HeapDumpOnOutOfMemoryError writes heap dump on OutOfMemoryError (recommended)
    
    -XX:+HeapDumpOnCtrlBreak writes heap dump together with thread dump on CTRL+BREAK
    

    有一篇很好的文章。你可以看到here。它可以解决您的问题。 您还可以使用jhat - Java堆分析工具,它位于JDK bin目录中。