thread
查看cpu飚高的线程thread id
可以查看具体哪行代码导致cpu飚高的jad
反编译的相关代码,查看到导致CPU飚高的代码详情,对错误进行修改mc
命令编译源代码,retransform
命令把 class加载到 JVM中去,实现热部署更新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小时内删除。
留言与评论(共有 0 条评论) |