【调优】使用jstack来找出查找哪个线程消耗cpu最高(死循环)的java代码

1、top查找出哪个进程消耗的cpu高

top

 

2. 查找哪个线程消耗cpu最高

top -H -p 5918

 

3. 执行jstack

jstack 5918 | grep -A 100 171f

-A 100表示查找到所在行的后100行。5919用计算器转换为16进制171f,注意字母是小写。

 

4. 执行jmap

注意:jmap会将jvm卡死,并将堆内存中各对象已经实例化了多少个信息查询出来,所以生产环境肯定不能直接使用!!!!!

1)对象已经实例化了多少个

jps // 查询进程号
jmap -histo 11988 | head -20 //查询堆内存中各对象已经实例化了多少个,而且大量无法回收

2)堆转储

注意:往外导入依然会卡死JVM,所以生产环境肯定不能直接使用!!!!!

可以设置 -XX:+HeepDumpOnOutofMemoryError,当发生OOM时(JVM已经死了),才会转储文件。

jmap -dump:format=b,file=20200912.hprof 11988 //对jvm整个堆进行转储产生一个dump二进制文件

然后再使用网上的工具进行分析,JVisualVM(JVM自带)、Jhat、MAT导入即可分析哪些对象占用内存比较多。

 

JVM自带工具生产环境不能远程观察,会有开启多个端口产生安全隐患及性能下降。

 

posted @ 2021-05-23 12:48  yifanSJ  阅读(337)  评论(0编辑  收藏  举报