欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线上CPU飙升,问题定位

程序员文章站 2022-06-09 15:02:31
...

1、定位到cpu最高PID

top

2、将线程PID转换为 16进制

为后面查找 jstack 日志做准备

#查看进程内最耗费CPU的线程
top -Hp pid

#该进程id是10进制的,需要转为16进制
printf “%x” PID

注意 (1)可以直接查找jstack数据

jstack PID | grep 54ee

(2)也可以通过以下步骤导出日志文件

3、导出top中cpu最高PID时实时栈文件

jstack PID > xx.log

4、分析栈文件,查询文件中线程状态:

java.lang.Thread.State:

BLOCKED过多:表示程序中有死锁的代码

RUNNABLE过多:表示程序一直在处理,检查是否有死循环

WAITING:无限等待另一个线程执行一个特定动作

关注WAITING ,BLOCKED的地方 可以初步定位到问题所在。

5、jmap导出top中cpu最高PID 的dump文件

注意点:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。

导出整个JVM 中内存信息

jmap -dump:live,format=b,file=/文件路径/heap-dump.bin  PID

6、分析dump文件

使用JDK下的jvisualvm.exe工具分析。 排查非基本数据类型 实例数和内存占用较高的包。定位到业务代码

【建议每次间隔一段时间,便导出dump文件,多个文件对比分析,单次的dump文件参考意义不大】