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

Java 在Apache Tomcat中运行的web应用程序中查找内存泄漏的建议,java,tomcat,memory-leaks,Java,Tomcat,Memory Leaks,我有一个Axis2 web服务,它刚刚在客户端站点上崩溃,它引发了以下异常: java.lang.OutOfMemoryError:无法创建新的本机线程 我只是从网站上取下日志,但在此期间,我想知道是否有人知道我可以使用任何监视工具来查找在Tomcat中运行的web应用程序中的内存泄漏。进行堆转储,并使用进行分析 试试。有几个步骤可以用来识别内存泄漏 首先更改web服务的启动参数。添加行-XX:+HeapDumpOnOutOfMemoryError,它将在jvm遇到OOM异常时为您捕获堆转储。您

我有一个Axis2 web服务,它刚刚在客户端站点上崩溃,它引发了以下异常: java.lang.OutOfMemoryError:无法创建新的本机线程


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

进行堆转储,并使用进行分析

试试。

有几个步骤可以用来识别内存泄漏

首先更改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,因此我不会详细介绍这个问题

请原谅我的疏忽,但是我如何在ApacheTomcat中转储JVM堆?+1 for Eclipse MAT-这非常好。您也可以尝试一下您的工具包(但这不是免费的)。@Omar-使用jmap命令:jmap-dump:live,format=b,file=xxx.hprof-pid。@Omar出于谨慎,这将在拍摄快照时冻结堆,如果必须在生产环境中进行堆转储,请尝试在非关键时间执行此操作environment@Omar或者用-XX:-HeapDumpOnOutOfMemoryError(可选地-XX:HeapDumpPath=…)启动tomcat,以便在tomcat停止运行时获得转储