问题描述:测试环境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%左右,系统非常稳定。