【问题标题】:how to find a place in the code where the memory leak?如何在代码中找到内存泄漏的地方?
【发布时间】:2016-06-07 04:31:45
【问题描述】:

我怎样才能捕捉到java.lang.OutOfMemoryError: Java heap space? 我有一些服务器可以工作,然后抛出java.lang.OutOfMemoryError: Java heap space。但我无法在代码中找到它发生的地方。在日志中没有发生它的信息。 我们分配了 8 GB 内存并且没有出现错误,但是服务器在某个时间点开始占用几乎整个内存。 哪些工具可以帮助我找到错误?

我尝试了 Visual JVM,但没有帮助。我找不到内存泄漏的代码

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

【问题讨论】:

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


【解决方案1】:

您可以使用诸如 JProfiler 或 VisualVM 之类的工具(还有许多其他工具,这里只提到两个选项)来分析堆转储,以确定哪种对象消耗的内存最多。这将使您了解应用程序中不同对象的实例数量、内存消耗。这样你就可以知道内存泄漏发生在哪里了。

JProfiler 等一些工具可让您连接到正在运行的 JVM 实例并跟踪方法调用树、创建某个对象的代码位置等,结合从堆转储中提取的上述详细信息,您可以获得更多信息关于内存泄漏发生位置的线索。

【讨论】:

    【解决方案2】:
    java.lang.OutOfMemoryError: Java heap space
    

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

    现在,如果您遇到此错误,则意味着是时候重新设计您的应用程序了。

    1. 检查如果您的应用程序正常关闭所有资源,可能会在 finally 阻塞或类似情况下发生。
    2. 检查您正在创建的对象。问问你自己,你是否真的需要一次又一次地创建任何对象,它可以是一个单例,那个对象的范围是什么——它是否是全局可访问的,那个对象的生命周期是什么。
    3. 尝试最小化对象的范围,我的意思是如果它真的很重要,那么让对象全局可访问。

    要分析堆转储,您可以使用以下参数执行 JVM:

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

    有一篇很好的文章。你可以看到here。它可能会解决您的问题。 你也可以使用jhat - Java Heap Analysis Tool,它在JDK bin目录下。

    【讨论】:

    • 我有大型服务器正在生产中,数百万用户在其中进行一些活动,并且在 3-6 小时后服务器崩溃。我无法模拟服务器崩溃时的情况。如果我不知道模块在哪里崩溃,如何检查数千行代码
    猜你喜欢
    • 2010-12-26
    • 2019-08-19
    • 2011-03-28
    • 2016-12-10
    • 1970-01-01
    • 2021-08-14
    • 2023-04-01
    • 2011-01-09
    • 2013-04-04
    相关资源
    最近更新 更多