Java进程CPU占用100% 排查

简介

上周碰到一个Java进程占用CPU较高的例子, 通过查询资料查出问题所在并对几个linux命令,以及命令之间的配合使用更加了解。

问题描述

一个基于Springboot的Web服务启动之后CPU占比一直居高不下,对于我们这个服务在启动时由于需要进行数据加载,CPU占比肯定会较高,但是数据加载完成后CPU占比仍然没有掉下来,另外查看该服务没有任何调用,就让人比较疑惑。

问题查看

通过使用linux命令top和ps可以定位到该服务的进程id(pid),通过jstack和pid可以打印进程的堆栈信息,但是不知道怎么来定位这个问题。另外判断出代码中应该哪里存在死循环,但是时间上不允许去一行一行的检查代码。

查看资料发现有很多人都遇到了这种类型的问题,我在这里找到的答案:线上应用故障排查之一:高CPU占用

根据博客中的方法我很快定位到出现问题的线程,找到了那段出现死循环的代码,修复之后问题得以解决。

解决步骤

通过那篇博客才知道自己使用的top, ps和jstack命令并没有真正使用好,之前只知道定位到进程,但是对于线程却不知道如何处理,随后又去翻了一下top和ps的man文档,算是再一次认识到这两个命令的强大。

其实我们这个CPU占用较高的问题定位并不复杂,主要步骤总结如下:

  • 定位进程

    通过top可以定位到服务的pid;或者通过ps 和grep直接定义服务的pid

  • 定位线程

    通过ps -mp [pid] -o THREAD,tid,time 可以定位到CPU高的线程,其中tid是线程id

  • 打印堆栈信息

    由于jstack中堆栈信息线程是十六进制,将tid转换为十六进制, tid_x=printf “%x” [tid]

    然后再使用jstack [pid] | grep “tid=0x[tid_x]” 定位到具体线程。

  • 查可能出现死循环的代码

    定位到线程后就可以找到对应的class,然后仔细分析可能出现死循环的代码,问题基本就解决了。

总结

针对那些使用的比较频繁的linux命令还是要仔细的阅读下man文档,做到对该命令的能力更加了解,才能再遇到问题时做好命令之间的配合使用,快速解决问题。

友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen**)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值