原因: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端口,可以看到詳細信息