在Apache Tomcat中运行的Web应用程序中查找内存泄漏的建议

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

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

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

试试VisualVM 。

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

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

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

这也可能是一种情况,它不是内存泄漏,而是客户端的负载然后预期。 看看调整启动参数以提供更多内存( -Xms-Xmx

除非您的客户能够在出现问题之前告诉您他们通过的参数,否则您必须自己进行一些调查,直到找到更多信息。

丹尼尔已经在他的回答中介绍了jmap,所以我不会详细介绍