现象:生产服务器偶尔CPU100%,一旦100%,就一直100%,日志长时间不输出任何信息,偶尔会打印一条。
2 使用jstack xxx 生成dump文件
3 定位到代码,确实有个在并发条件下,可能出现无限循环的地方,修改了就可以了。
总结:
使用jstack查看线程情况。当是垃圾回收线程一直full gc时, 使用jmap查看那个对象创建的比较多,再结合jstack的线程数据,定位到相关代码。
可以用的下的命令:
参考:http://blog.csdn.net/five3/article/details/28416771
https://www.cnblogs.com/zyhxhx/p/4564953.html
先用top查看占用cpu的进程id
top -H -p 3582
用ps -mp pid -o THREAD,tid,time 打印出该进程下的线程占用cpu情况
jstack [进程] | grep -A 10 [线程的16进制] 打印线程的堆栈信息
printf "%x\n" tid 线程ID转换为16进制格式
查看gc状况:1511274为进程号
jstat -gcnew 1511274 1000 10
jstat -gcutil 1511274 1000 10
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.51 74.23 3.55 23.37 197 46.478 168 628.104 674.582
0.00 0.51 74.76 3.55 23.37 197 46.478 168 628.104 674.582
0.00 0.51 74.90 3.55 23.37 197 46.478 168 628.104 674.582
可以使用jmap来打印堆里的对象个数。
jmap -heap 1511274
java虚拟机
java使用内存 3g -Xmx3g -Xms3g
java新生代内存 1g -Xmn1g
-XX:PermSize=256m -XX:MaxPermSize=256m 持久代256m
/usr/java/default/bin/java -Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xmx3g -Xms3g -Xmn1g -Xss256k -Dfile.encoding=utf-8 -XX:PermSize=256m -XX:MaxPermSize=256m
-javaagent:/var/fix/fix-bootstrap.jar
-Djava.endorsed.dirs=/opt/apache-tomcat/endorsed
-classpath /opt/apache-tomcat/bin/bootstrap.jar:/opt/apache-tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/var/xxx -Dcatalina.home=/opt/apache-tomcat
-Djava.io.tmpdir=/var/xxx/temp org.apache.catalina.startup.Bootstrap start
分析流程:
1 开始想,一定是有线程一直运行,所以导致CPU100%。 直接想到了jstack。
使用jstack生成了一个thread dump文件。 jstack -l xxx 没有响应, 最后使用 jstack -F xxx 生成了一个thread dump。 查看生成的dump文件, 里面都是BLOCKED的线程。 这真是颠覆我的理论基础,BLOCKED不会占用太多CPU的啊。。。
2 使用jstack xxx 生成dump文件
生成的thread dump终于可以网上的格式对应起来了,开心。查找CPU占用高的线程, 一查,靠,都是垃圾回收线程。
3 定位到代码,确实有个在并发条件下,可能出现无限循环的地方,修改了就可以了。
总结:
使用jstack查看线程情况。当是垃圾回收线程一直full gc时, 使用jmap查看那个对象创建的比较多,再结合jstack的线程数据,定位到相关代码。
可以用的下的命令:
参考:http://blog.csdn.net/five3/article/details/28416771
https://www.cnblogs.com/zyhxhx/p/4564953.html
先用top查看占用cpu的进程id
top -H -p 3582
用ps -mp pid -o THREAD,tid,time 打印出该进程下的线程占用cpu情况
jstack [进程] | grep -A 10 [线程的16进制] 打印线程的堆栈信息
printf "%x\n" tid 线程ID转换为16进制格式
查看gc状况:1511274为进程号
jstat -gcnew 1511274 1000 10
jstat -gcutil 1511274 1000 10
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.51 74.23 3.55 23.37 197 46.478 168 628.104 674.582
0.00 0.51 74.76 3.55 23.37 197 46.478 168 628.104 674.582
0.00 0.51 74.90 3.55 23.37 197 46.478 168 628.104 674.582
可以使用jmap来打印堆里的对象个数。
jmap -heap 1511274
java虚拟机
java使用内存 3g -Xmx3g -Xms3g
java新生代内存 1g -Xmn1g
-XX:PermSize=256m -XX:MaxPermSize=256m 持久代256m
/usr/java/default/bin/java -Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xmx3g -Xms3g -Xmn1g -Xss256k -Dfile.encoding=utf-8 -XX:PermSize=256m -XX:MaxPermSize=256m
-javaagent:/var/fix/fix-bootstrap.jar
-Djava.endorsed.dirs=/opt/apache-tomcat/endorsed
-classpath /opt/apache-tomcat/bin/bootstrap.jar:/opt/apache-tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/var/xxx -Dcatalina.home=/opt/apache-tomcat
-Djava.io.tmpdir=/var/xxx/temp org.apache.catalina.startup.Bootstrap start