实例:printf ‘%x\n’ 406 405 375 376,得到结果196、195、177、178;如下图所示:
查看堆栈,定位线程
命令:jstack 【进程PID】| grep 【线程转换后十六进制】-A10 , 使用jstack获取进程PID堆栈,利用grep定位线程id,打印后续10行信息。
实例:jstack 373 | grep ‘0x196’ -A10,如下图所示:
我们通过查看堆栈信息,发现了问题是TestWhile.whileTrue引起的;
而且发现有2个GC线程,看上图中的“GC task thread#0 (ParallelGC)”,代表垃圾回收线程,该线程会负责进行垃圾回收
存储堆栈,批量查看
查看堆栈信息,我们也可以换个方法查看,可以先将jstack堆栈信息存储起来。
命令:jstack 【进程PID】> 【文件】
实例:jstack 373 > demo.dump,存储373进程的堆栈信息。
再使用cat + grep查找看看后面几个高CPU线程的堆栈信息。
实例:cat -n demo.dump | grep -A10 ‘0x196’,如下图所示:
可以看到线程0x196【线程196】产生堆栈信息,直指方法whileTrue。
GC查看
我们看到上图中有4个线程中的2个线程没有看到java代码,而是GC task thread#0 (ParallelGC),这个是GC垃圾回收的线程,是不是死循环导致了GC太频繁,导致CPU使用率居高不下呢?
我们使用jstat看下jvm的GC信息看看。
命令:jstat -gcutil 【进程PID】【毫秒】【打印次数】
实例:jstat -gcutil 373 2000 5,查看373进程的GC信息,每2秒打印一次,共打印5次,如下图所示:
S0:幸存1区当前使用比例 S1:幸存2区当前使用比例 E:伊甸园区使用比例 O:老年代使用比例 M:元数据区使用比例 CCS:压缩使用比例 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
上面的原生方法查找要遵循一定的步骤,相对有些麻烦点,有没有比较简单的方法呢?往下看
Arthas(阿尔萨斯)
Arthas(阿尔萨斯)是阿里巴巴开源出来的一个针对 java 的线上诊断工具,功能非常强大。Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。我们来看看
下载Arthas
1
使用arthas-boot(推荐)
下载arthas-boot.jar,然后用java -jar的方式启动:
1. `curl -O https://alibaba.github.io/arthas/arthas-boot.jar` 2. `java -jar arthas-boot.jar`
按1进入java进程,此时java进程PID已经变成373
进入阿尔萨斯完成,如下图,可以看到登录路径已经变成了[arthas@17376]$,可以输入dashboard,进入监控页面了。
监控查看
已经进入Arthas操作界面,输入dashboard,回车后将看到线程及堆栈信息,如图所示,arthas已经将cpu高使用率的线程给安排上了。
上面我们就看到有2个线程居高不下,还有GC的数量和耗时。
thread【ID】查看线程
ctrl + c 退出dashboard界面,输入thread 32查看线程信息,如下图所示:
可以看到是TestWhile类中的whileTrue方法中的put方法导致cpu使用率升高。
问题一下子就出来了,Arthas功能不单单止于此,可以直接反编译,看看代码。
jad反编译
使用Arthas自带的反编译方法jad,输入命令:
* jad com.rainbow.demo.service.TestWhile*
可以反编译java的class查看问题函数的具体代码,如下图所示:
退出arthas
最后,既然问题已经找到,那就退出Arthas吧。输入命令:quit
Arthas的功能是非常强大的,这里就简单介绍,下一次老顾用专门的文章介绍
老顾在介绍一个更简单的一个脚本,立刻发现问题所在
show-busy-java-threads
show-busy-java-threads.sh这个工具是useful-scripts工具集的其中一个工具。
show-busy-java-threads用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。
注意:此工具的核心还是使用jdk的jstack方法,只是在其上做了封装展示。
下载到当前目录下
下载地址:https://github.com/oldratlee/useful-scripts/releases
在bin下面有很多工具,我们这次只要show-busy-java-threads.sh
上传show-busy-java-threads脚本到服务器
一定赋予执行权限
chmod +x show-busy-java-threads
直接运行
1. `./show-busy-java-threads `
如下图所示,找到了CPU使用率前5高的线程,查找非常迅速。
从前面两个线程可以看出,与使用原生工具(jstack)看到的一样。
其他命令
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/c2df90c3913d989ae53f407bd43e9826.jpeg)
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
PO-1712433944025)]
更多笔记分享
[外链图片转存中…(img-g0PV5BYh-1712433944025)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!