文章目录
1. top指令查看进程找到高cpu占用pid
2. top -Hp 115705,查询高cpu占用进程的各线程情况
- "VMThread"线程主要用于GC垃圾回收、dump 线程堆栈数据
- 如图所示vm thread cpu100%,应该是存在大对象导致频繁gc,可以直接跳到本文
第4步
导出堆栈信息进行分析
3. 执行jstack查看堆栈信息
- jstack <pid> | grep <线程16进制id> -A<行数>
eg. printf "%x\n" <线程10进制id> (该命令用于得到线程16进制id)
eg. jstack 115705 | grep 1c41f -A 20
- jstack <pid> > <文件名>
eg. jstack 115705 >./115705java.dump
- 报错:115705: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding - 可能原因:
https://blog.51cto.com/zhangshaoxiong/1310166 - 解决方案:1.如果是启动进程的用户与当前用户不同导致,切换用户再使用上述命令 2.如果不是用户原因,使用jstack -F pid(加上-F )命令 3.如果还解决不了可以采用重启进程解决该问题 (如果不想重启进程直接采用下面第4点导出堆栈信息进行分析即可)
4. 导出堆栈信息
jmap -dump:live,format=b,file=live_web_dump.hprof 115705
5. 将hprof文件导入jprofiler分析
- 点击Start Center导入hprof文件
- 点击Biggest Objects
- 选择Incoming referrences
- 找到产生大对象的方法,回归代码优化该方法