项目运行时,发生CPU飚高怎么办?

阅读: 评论:0

项目运行时,发生CPU飚高怎么办?

项目运行时,发生CPU飚高怎么办?

1、思路总结

  • 启动Arthas去监控Java进程
  • 使用thread 查看cpu飚高的线程
  • 使用thread id可以查看具体哪行代码导致cpu飚高的
  • 保存使用jad反编译的相关代码,查看到导致CPU飚高的代码详情,对错误进行修改
  • 使用mc命令编译源代码,retransform 命令把 class加载到 JVM中去,实现热部署更新
  • 如果使CPU飚高的线程无法慢慢恢复,如一个while的死循环,就要使用jstack排查问题线程,并kill掉,而Arthas并没有提供杀死线程的命令

2、实践如下

1、CPU飚高的场景在我项目中模拟出现:

    @RequestMapping("/test")public void  test(){new Thread(() -> {int i = 0;while (true) {//业务代码,模拟执行很慢,一直占用CPUi++;}},"CPU_Thread").start();}

2、启动Arthas去监控Java进程:

java -jar arthas-boot.jar

3、使用thread 查看cpu飚高的线程:

4、使用thread id 可以查看具体哪行代码导致cpu飚高的:

5、保存使用jad反编译的相关代码,查看到导致CPU飚高的代码详情,对错误进行修改

jad --source-only com.atguigu.ller.WmsWareSkuController > ./WmsWareSkuController.java

6、对保存的WmsWareSkuController.java进行修改:

7、使用mc命令编译源代码:

mc ./WmsWareSkuController.java   -d   ./ 

但是这里编译出错了:

官方提示:

所以我们本地编译好 class 文件,上传上去

8、retransform 命令把 class加载到 JVM 中去,实现热部署更新:

retransform ./WmsWareSkuController.class

9、kill掉无法恢复的问题线程

如果使CPU飚高的线程无法慢慢恢复,如一个while的死循环,就要使用jstack排查问题线程,并kill掉,而Arthas并没有提供杀死线程的命令,流程如下:

  • top:找出CPU飙升的进程ID

  • ps -mp pid:找出进程中飙升的线程ID

  • printf “%xn” tid :将pid转化为16进制 将线程ID转化为16进制,不然找不到

  • jstack pid | grep tid >> :打印飚高的线程详情,这里也可查看该线程中哪行代码导致CPU飙升,如果与Arthas的一致,直接kill掉

一般情况下,不会出现死循环,会慢慢恢复,Arthas更加方便,如果需要kill线程,或者在容器中未安装Arthas,就要使用jdk自带的命令进行定位了

本文发布于:2024-01-31 15:33:20,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668640129544.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:发生   项目   CPU
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23