JMAP转储大小为4.5 GB。 Eclipse MAT显示总共415 MB的堆,我如何分析剩余的转储?

问题描述:

我正在使用Tomcat 6运行Web应用程序。我们使用的是开放式JDK 6.我们是AMD 64位Ubuntu 11.04服务器。JMAP转储大小为4.5 GB。 Eclipse MAT显示总共415 MB的堆,我如何分析剩余的转储?

存储器转储被取由该命令

jmap -dump:format=b,file=/home/demon/Desktop/mymemorydump.hprof 2762 

存储器转储是4.5 GB的。当我们使用eclipse MAT进行分析时,Strong Reachable对象为80 MB,Unreachable对象为335 MB。 如何分析转储的其余部分..

此过程在我的服务器上占用的内存是4.5 GB 。现在这个内存永远不会降到1GB的正常水平。这个内存缓慢增加到8-9 GB,然后我们的Tomcat停止响应(Actully没有memroy错误)。

我的Tomcat的配置是

/usr/lib/jvm/java-6-openjdk/bin/java -Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties -Djava.awt.headless=true -Xms1024m -Xmx6144m -XX:+UseConcMarkSweepGC -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat6/endorsed -classpath /usr/share/tomcat6/bin/bootstrap.jar -Dcatalina.base=/var/lib/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.io.tmpdir=/tmp/tomcat6-tmp org.apache.catalina.startup.Bootstrap start 

你可能有一个线程泄漏,已经创造了从未终止线程的数量过多。每个线程分配堆栈空间,这在上面没有显示。按Ctrl- \(unix)(或在Windows中Ctrl-Break)将转储每个线程的堆栈跟踪(您可能需要重定向tomcat的STDERR以避免它从终端滚动)。如果你没有从终端启动tomcat,那么使用“kill -QUIT YourPID”而不是Ctrl-。

另外,JConsole的(在JDK bin目录下)可以连接到你的可执行文件,它会停止响应之前。它可能会在事情失控之前向您显示线程(或堆)的泄漏。