java程序cpu过高排查

java程序cpu过高排查

对以往经验的总结,这些一直存在我的笔记中,准备弄到我的博客进行分享,也顺便在网上进行备份

背景

程序中明显发生卡顿现象,甚至请求有些已经超时,在服务器查看,cpu已经飙高到100%

分析

流量问题可以忽略,cpu依然很高,说明是程序本身导致的,大概率是定时任务频繁执行,死循环,死锁等状况让线程一直在执行,现在首要任务是找出是哪些线程长期占有cpu,可以使用jdk自带的工具,jstack,jstat,jmap,或者高级工具jprofilter,mat等

定位

1 找出进程

top指令,查看服务器资源占有情况,找出cpu飙高的pid ,如图是4179在这里插入图片描述

2 找出线程

可以用

ps -mp 4179 -o THREAD,tid,time 

在这里插入图片描述

找出tid,但是我觉得这个不容易记住

推荐用下面指令 ,查看各个线程的cpu情况

top -Hp 4179 

在这里插入图片描述

3 转16进制

将tid 转化为16进制,方便在堆栈中定位代码块

printf "%x\n" 4528,转成16进制为 11b0

4 定位代码块

用jstack定位代码块,grep保留30行

jstack 4179|grep 11b0 -A 30 ( jstack pid|grep TID(16进制) -A 30 )

在这里插入图片描述

总结

图中看出线程长期占用资源,其他线程处于WAITING状态,最终定位是一个分布式锁的实现模块保持锁中有一个问题,需要注意这种情况对系统本身的影响,避免正常请求的阻塞,分布式锁保持最大时间进行限制,避免长期持有,虽然有看门狗机制,但是一个业务线程长期持有肯定有问题,超过时间必须快速失败

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值