問題描述:測試環境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%左右,系統非常穩定。