记录 Linux环境下java web项目CPU爆表 “事故”,肇事者:GC
2016-06-22 16:55
579 查看
笔者今天将新开发的项目部署到新服务器的时候,出现了个“奇怪”的现象。项目启动完毕后,一切正常。在运行其中一个项目的时候,突然出现卡格的现象,很久没有响应。于是通过top查看,发现tomcat进行的cpu竟然达到100+%!!
这是在测试过程中不曾出现的,于是开始查看问题所在。
①top查看cpu情况,获取cpu爆表的进程id(pid)
②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的内存后重新启动,项目运行正常:)
附:
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"
这是在测试过程中不曾出现的,于是开始查看问题所在。
①top查看cpu情况,获取cpu爆表的进程id(pid)
②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的内存后重新启动,项目运行正常:)
附:
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"
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树