筆者今天將新開發的項目部署到新服務器的時候,出現了個「奇怪」的現象。項目啓動完畢後,一切正常。在運行其中一個項目的時候,忽然出現卡格的現象,好久沒有響應。因而經過top查看,發現tomcat進行的cpu居然達到100+%!! linux
這是在測試過程當中未曾出現的,因而開始查看問題所在。 apache
①top查看cpu狀況,獲取cpu爆表的進程id(pid) vim
②top -H -p 8413 查看致使cpu爆表的線程id(pid):8423
將對於pid從十進制轉換成十六進制
③使用jstack pid(進程號) > jstack_log.log
jstack 6989 > a.txt
將堆棧信息導出。查找nid=Ox20e7的信息
"VM Thread" prio=10 tid=0xf68e9400 nid=0x20e7 runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0xf680c400 nid=0x20df runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0xf680dc00 nid=0x20e0 runnable
"GC task thread#2 (ParallelGC)" prio=10 tid=0xf680f400 nid=0x20e1 runnable
"GC task thread#3 (ParallelGC)" prio=10 tid=0xf6810800 nid=0x20e2 runnable
"GC task thread#4 (ParallelGC)" prio=10 tid=0xf6812000 nid=0x20e3 runnable
"GC task thread#5 (ParallelGC)" prio=10 tid=0xf6813400 nid=0x20e4 runnable
"GC task thread#6 (ParallelGC)" prio=10 tid=0xf6814c00 nid=0x20e5 runnable
"GC task thread#7 (ParallelGC)" prio=10 tid=0xf6816000 nid=0x20e6 runnable
發現是GC致使的cpu太高的問題。
④而後筆者使用jstat -gc 8413 5000 進行觀察
[root@cncln ~]# jstat -gc 8647 5000
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
64.0 64.0 16.0 0.0 349376.0 0.0 699072.0 25557.0 65536.0 65536.0 344 0.748 331 73.973 74.721
64.0 128.0 64.0 0.0 349248.0 0.0 699072.0 25556.1 65536.0 65536.0 366 0.781 353 78.904 79.685
128.0 128.0 48.0 0.0 349248.0 0.0 699072.0 25557.4 65536.0 65536.0 388 0.817 375 83.834 84.650
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25559.9 65536.0 65536.0 411 0.852 398 88.979 89.831
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25559.2 65536.0 65536.0 433 0.895 420 93.903 94.797
64.0 64.0 0.0 0.0 349312.0 0.0 699072.0 25559.8 65536.0 65536.0 455 0.930 442 98.823 99.753
64.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25558.9 65536.0 65536.0 477 0.972 464 103.743 104.715
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25557.8 65536.0 65536.0 499 1.009 486 108.653 109.662
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25556.1 65536.0 65536.0 521 1.052 508 113.594 114.647
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25554.7 65536.0 65536.0 543 1.099 530 118.535 119.634
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25553.5 65536.0 65536.0 565 1.143 552 123.468 124.610
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25551.9 65536.0 65536.0 587 1.184 574 128.418 129.602
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25550.2 65536.0 65536.0 609 1.220 596 133.351 134.571
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25559.7 65536.0 65536.0 631 1.257 618 138.331 139.588
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25555.9 65536.0 65536.0 653 1.299 640 143.263 144.561
128.0 128.0 0.0 0.0 349248.0 0.0 699072.0 25554.4 65536.0 65536.0 675 1.349 662 148.128 149.477
64.0 64.0 64.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 696 1.389 683 152.811 154.200
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.3 65536.0 65536.0 717 1.426 704 157.497 158.923
64.0 64.0 48.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 738 1.461 725 162.145 163.606
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 759 1.495 746 166.845 168.340
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 779 1.526 766 171.358 172.884
64.0 64.0 16.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 800 1.563 787 176.054 177.617
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.3 65536.0 65536.0 821 1.607 808 180.676 182.282
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 842 1.646 829 185.267 186.913
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.2 65536.0 65536.0 863 1.692 850 190.063 191.755
64.0 64.0 0.0 0.0 349376.0 0.0 699072.0 25554.3 65536.0 65536.0 885 1.726 872 194.630 196.356
發現全部的年輕代,老年代以及持久代的容量一直不斷在上升,直至持久代被佔滿,頻繁的觸發FGC。
⑤同時查看了gc日誌,也證明了這一點,發現GC的頻率很高。
發現一秒內居然觸發了5次Full GC tomcat
終於在肯定了是tomcat內存不足致使的問題後,配置了tomcat的內存後從新啓動,項目運行正常:) 服務器
附:
linux tomcat GC、內存配置
vim apache-tomcat-6.0.32/bin/catalina.sh
#JAVA_OPTS="-Xloggc:/usr/local/space/logs/gc_tomcat.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC "
JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m" 測試