天天看點

記一次tomcat啟動後無服務的問題

問題描述:測試環境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,如下圖

記一次tomcat啟動後無服務的問題

全是這個。

四:看到這裡,我想看看線程

在幹嘛:于是記憶體轉儲 : jmap -dump:format=b,file=test.dump  12819

    得到test.dump檔案後用jdk下bin的visualVM打開,線上程那裡就可以看到所有的線程正在執行的過程。

五:我線上程執行中看到了Spring 在初始化容器,于是線上程調用棧中找到了 new ClassPathXmlApplicationContext 這樣的代碼在被多個線程執行。于是修改了代碼。

六:修改代碼後,程式釋出後,old區保持在30%左右,系統非常穩定。