問題描述:測試環境tomcat啟動後無服務。
針對這個問題:我想了很多思路,這裡隻是說下正确的思路。
使用到的工具有:jps ,jstat ,jmap,vislualVM
tomcat啟動後無服務。在jdk/bin目錄下有兩個工具。jps 和 jstat 。
一:jsp檢視到tomcat的pid,就是 18938 Bootstrap 這樣的一個程序
二:jstat -gcutil 18938 1000 10
列印記憶體情況,1000表示1秒列印一次,10表示列印10次。列印的結果會是:
S0 S1 E O P YGC YGCT FGC FGCT GCT
75.52 0.00 48.74 99.04 40.40 154 2.552 0 0.000 2.552
75.52 0.00 48.75 99.04 40.40 154 2.552 0 0.000 2.552
朱惡意這裡有一個O,表示Old使用的百分比,我這裡Old使用了99,就表示Old區已經滿了。于是我在tomcat的啟動參數上加了列印gc日志。
三:在tomcat的bin下的 catalina.sh 的jvm參數加了 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/gc.log
tomcat啟動後,直接在gc.log看到了系統在不斷的執行FULL GC,如下圖

全是這個。
四:看到這裡,我想看看線程
在幹嘛:于是記憶體轉儲 : jmap -dump:format=b,file=test.dump 12819
得到test.dump檔案後用jdk下bin的visualVM打開,線上程那裡就可以看到所有的線程正在執行的過程。
五:我線上程執行中看到了Spring 在初始化容器,于是線上程調用棧中找到了 new ClassPathXmlApplicationContext 這樣的代碼在被多個線程執行。于是修改了代碼。
六:修改代碼後,程式釋出後,old區保持在30%左右,系統非常穩定。