cpu飙高处理步骤
1.top查找出哪个进程消耗的CPU高(top -c)
2.top -h -p查找出哪个线程消耗的cpu高(top -h -p pid)
3.printf%x进行pid的进制转换
4.jstack记录进程的堆栈信息
5.找出消耗CPU最高的线程信息
内存飙高处理步骤
1.jstat命令查看FGC发生的次数和消耗的时间,次数越多,耗时越长说明存在问题;
2.连续查看jmap -heap查看老生代的占用情况,变化越大说明程序存在问题;
1.使用连续的jmap -histo:live命令导出文件,比对加载对象的差异,差异部分一般是发生问题的地方。
GC引起的单核飙高
1.单个CPU占用率高,首先从GC查起。
常见SY飙高
1.线程上下文切换频繁
2.线程太多
CPU 飚高
一般是死循环或者死锁问题导致。
-
通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID {pid}。
top -M -n 2 -d 3 >{pid}/top.txt 查看top -
再次通过 top -Hp {pid} 找到 CPU 消耗最高的线程 ID,并记住线程 ID(十进制).
3.通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。
jstack {pid} >{pid}/jstack_1.txt 一次堆栈快照 备用
jstack {pid} >{pid}/jstack_2.txt 两次堆栈快照 备用
由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。
使用 printf “%x\n” [十进制数字] ,可以将10进制转换成16进制。
通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。