原因:tomcat下的应用跑了一段时间,应用访问特别慢
分析:
[root@yidong bin]# ps -ef | grep java
root 309 32447 20 10:16 pts/2 00:00:32 /usr/java/jdk1.6.0_37/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-6.0.36/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-6.0.36/endorsed -classpath /usr/local/apache-tomcat-6.0.36/bin/bootstrap.jar -Dcatalina.base=/usr/local/apache-tomcat-6.0.36 -Dcatalina.home=/usr/local/apache-tomcat-6.0.36 -Djava.io.tmpdir=/usr/local/apache-tomcat-6.0.36/temp org.apache.catalina.startup.Bootstrap start
root 519 32447 0 10:19 pts/2 00:00:00 grep java
根据第二列,获取进程的pid号(或者使用jps、jps -v、jps -l,直接获取到进程的pid)
[root@yidong bin]# jstat -gcutil 309
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 99.72 100.00 4.57 99.97 5 0.088 0 0.000 0.088
第一行各个字母的意思:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
每1000毫秒,打印一次,共打印5次,可以用:[root@yidong bin]# jstat -gcutil 309 1000 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 99.56 66.25 6.01 99.79 7 0.085 0 0.000 0.085
0.00 99.56 66.25 6.01 99.79 7 0.085 0 0.000 0.085
0.00 99.56 66.25 6.01 99.79 7 0.085 0 0.000 0.085
0.00 99.56 66.25 6.01 99.79 7 0.085 0 0.000 0.085
0.00 99.56 66.25 6.01 99.79 7 0.085 0 0.000 0.085
经过以上分析,初步判定是 Perm space空间不足,需要在jvm启动的时候添加启动参数来解决。
linux下,在tomcat启动的Catalina.sh的注释下的首行,添加:
JAVA_OPTS="-Xms5120m -Xmx5120m -Xmn2048m -XX:PermSize=512m -XX:MaxPermSize=512m"
需要根据实际情况来设置,可以设置jvm堆栈和PermSize的大小。
更多jstat的用法参见博客:http://www.51testing.com/?uid-77492-action-viewspace-itemid-203728
另外,使用jmap可以打印jvm的内存映射:
jmap -histo 4939
或
jmap -dump:format=b,file=test.bin 4939
jmap 导出的bin文件,可以用jhat来分析,方法是:jhat test.bin,然后会开启7000端口,访问http://localhost:7000端口,可以看到详细信息