【问题标题】:Suggestions for finding a memory leak in a web application running in Apache Tomcat在 Apache Tomcat 中运行的 Web 应用程序中查找内存泄漏的建议
【发布时间】:2011-06-14 13:01:44
【问题描述】:

我有一个 Axis2 Web 服务,它刚刚在客户端站点上摔倒了,它抛出了以下异常: java.lang.OutOfMemoryError: 无法创建新的本地线程

我只是将日志从网站上拉下来,但在此期间,我想知道是否有人知道我可以使用任何监视工具来查找运行在 Tomcat 中的 Web 应用程序中的内存泄漏。

【问题讨论】:

    标签: java tomcat memory-leaks


    【解决方案1】:

    进行堆转储,并使用Eclipse Memory Analyzer 对其进行分析。

    【讨论】:

    • 原谅我的天真,但是我将如何将 JVM 的堆转储到 Apache tomcat 中?
    • +1 用于 Eclipse MAT - 非常好。你也可以试试 YourKit(但这不是免费的)。
    • @Omar - 使用 jmap 命令:jmap -dump:live,format=b,file=xxx.hprof pid。
    • @Omar 谨慎起见,这将在拍摄快照时冻结堆,如果您必须在生产环境中进行堆转储,请尝试在非关键时间执行此操作跨度>
    【解决方案2】:

    试试VisualVM

    【讨论】:

      【解决方案3】:

      您可以使用几个步骤来识别内存泄漏。

      从更改 Web 服务的启动参数开始。添加行-XX:+HeapDumpOnOutOfMemoryError,当jvm 遇到OOM 异常时,它将为您捕获堆转储。您可以使用此信息来很好地表示内存中的哪些对象占用了所有可用内存。在等待 OOM 被复制时,您可以查看要添加到启动中的第二组参数,以下记录 GC 活动,-XX:+PrintGCDetails -verbose:gc -Xloggc:/log/path/gc.log。通过这些数据,您可以了解 OOM 是逐渐发生还是迅速发生。

      另一种方法是使用 VisualVM 之类的程序,该程序可用于分析 Web 服务。这将附加到您正在运行的 JVM(最好是在开发环境中),然后尝试进行压力测试以找出问题所在,尝试使用 JMeter 来帮助进行压力测试。 VisualVM 位于您的 JAVA_HOME/bin 文件夹中(v6 及更高版本)

      这也可能是不是内存泄漏的情况,只是客户端的负载比预期的要多。查看调整启动参数以提供更多内存(-Xms-Xmx

      除非您的客户可以告诉您他们在问题发生之前传递的参数,否则您必须自己进行一些调查,直到找到更多信息。

      Daniel 已经在他的回答中介绍了 jmap,所以我不会详细说明

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-05
        • 2012-05-05
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 2012-11-09
        相关资源
        最近更新 更多