【java 面试】记录一次“诡异的“CPU 100%问题

5 篇文章 0 订阅
现象:生产服务器偶尔CPU100%,一旦100%,就一直100%,日志长时间不输出任何信息,偶尔会打印一条。

分析流程:


1 开始想,一定是有线程一直运行,所以导致CPU100%。 直接想到了jstack。


使用jstack生成了一个thread dump文件。  jstack -l xxx   没有响应, 最后使用 jstack -F xxx 生成了一个thread dump。 查看生成的dump文件, 里面都是BLOCKED的线程。 这真是颠覆我的理论基础,BLOCKED不会占用太多CPU的啊。。。


经过一夜的思考, 我靠,会不会-F参数导致JAVA所有线程先BLOCKED,然后在生成的Thread dump,在机器上测试了一下,果然就是这样的。你大爷啊,为什么网上没有人说这个问题!!!官网也没有说。


2 使用jstack xxx 生成dump文件

生成的thread dump终于可以网上的格式对应起来了,开心。查找CPU占用高的线程, 一查,靠,都是垃圾回收线程。


好,问题找到了,就是程序中的一个方法一定条件下可以触发一个无限循环,每循环一次,创建了一个对象,所有java堆满了,引起了java垃圾回收。java回收线程不能回收对象释放堆内存,所以垃圾回收线程一直执行,CPU 100%。


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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值