2013-01-11 59 views
4

我正在使用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 

回答

2

你可能有一個線程泄漏,已經創造了從未終止線程的數量過多。每個線程分配堆棧空間,這在上面沒有顯示。按Ctrl- \(unix)(或在Windows中Ctrl-Break)將轉儲每個線程的堆棧跟蹤(您可能需要重定向tomcat的STDERR以避免它從終端滾動)。如果你沒有從終端啓動tomcat,那麼使用「kill -QUIT YourPID」而不是Ctrl-。

另外,JConsole的(在JDK bin目錄下)可以連接到你的可執行文件,它會停止響應之前。它可能會在事情失控之前向您顯示線程(或堆)的泄漏。

相關問題