JVM占用CPU过高或者线程卡死定位

新项目上线初期经常会遇到CPU过高或者线程卡死问题,这虽然是两类性能瓶颈问题,但是定位方法一致,项目中也遇到过几次,分享下定位经验

1、登录项目所在服务器,直接执行top命令,可以看到cpu使用情况,详细看到某个进程占用cpu的情况和执行时间,此时一般会发现某个进程占用cpu超过100%,且执行时间特别长,此进程一般就是罪魁祸首。

利用ps -ef | grep  1388924可以发现此进程为项目执行的进程

 2、找到占用cpu过高或者执行时间很长的进程,然后执行top -Hp 1388924(进程号),可以查看该进程下的具体线程的执行信息,可以发现33861线程主要耗CPU且执行时间比较长,可以确定此线程有问题

3、执行命令导出线程信息jstack 33861 >/data/jstack/jstack.log,可以把jvm的线程执行信息保存到文件中,通过工具下载到本地进行分析

4、利用linux的printf命令转化线程号为十六进制,线程信息的线程号为十六进制,执行printf "%x\n" 33861,结果为8445

5、打开statck.log进程信息,搜索nid=0x8445的进程,查看堆栈日志即可,通过堆栈日志即可找到是哪行代码导致cpu占用cpu过高或者卡死(此图非33861线程的截屏,作为示例

说明:cpu负载过高或者线程卡死还是比较好定位,基本都可以根据线程堆栈信息直接找到相关代码,分享下工作中遇到过相关情况,基本都是代码实现不当或者异常处理不当导致

cpu过高:1、一直Full GC,其实已内存溢出 

                 2、进行时间比较长的统计计算,对象长期无法释放

线程卡死: 1、http请求第三方,没有设置connect超时时间,长时间没有返回结果,卡死

                   2、线程从MQ获取数据,MQ本身已经挂掉,一直等待从MQ获取数据,导致程序无法                          执行下去

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值