Java程序线上运行CPU占用100%的处理方法

最近在线的一个服务,经常出现CPU 100%的情况,发生的没有规律,看服务器监控,可以看到有数据进入服务器,然后CPU就100%,这个基本就是同时发生的,一开始判断是不是有人往系统里导入数据造成的,排查了很多次,发现不是这个情况。然后就在网上找资料,进行分析。经过多次查找资料,结合实际情况,对这样的情形处理方式进行总结。

CPU占用100%,根据我的实战经验来说,一共有两种可能:

1.程序进入死循环

2.触发频繁GC

这两种情况是逐步排查的。

第一步,通过 top命令找到占用cpu最高的进程id,然后通过

top -Hp <pid>

找到进程中cpu占用最高的线程id,然后把线程id转化为16进制,通过

jstack pid(进程ID) | grep tid(线程ID 16进制的值) -A 30 > jstack.txt

分析jstack文件,如果jstac.txt文件里面能找到程序中的相关代码,那就基本定位到问题代码了。如果jstack.txt 文件中打印出来的是 gc相关的线程,那基本就是出发频繁GC了。此时开始第二步:

通过

jstat -gcutil <进程ID> 2000 10

查看GC情况

这个图片是出问题前和出问题后我的服务器的情况,从图中明显看出FGC的次数增多了(看懂这个图,需要学习一下GC,Java 内存区域和GC机制 - Leo Chin - 博客园Java系列笔记(4) - JVM监控与调优 - Daniel·广 - 博客园,这两篇博文顺序阅读),这就是明显的频繁触发GC导致的CPU过高的问题。剩下的步骤就比较简单了,该步骤需要用到一个工具:MemaryAnalyzer,下载链接:MemoryAnalyzer-Java文档类资源-CSDN下载

通过指令:

jmap -dump:format=b,file=./stack.dump <pid>  

生成stack.dump文件,然后下载到本地,打开Memoryanalyzer(如果dump文件超过1G,先去设置MemoryAnalyzer.ini里面的最后一个参数,默认是1024M,这个大小要超过dump文件的大小),file->open file 打开stack.dump文件,加载完成后就如下图:

 这里就能找到问题,点击上图中的红色方块的部分,就能定位到相关代码。

找到代码,就自己去分析问题吧。大部分都是自己代码有问题导致的。

如果有其他情况,欢迎在评论区交流。

参考文章:

百度安全验证

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值