笔者今天将新开发的项目部署到新服务器的时候,出现了个“奇怪”的现象。项目启动完毕后,一切正常。在运行其中一个项目的时候,忽然出现卡格的现象,好久没有响应。因而经过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" 测试