文章目录
- [0 前言](#0 前言)
- 1.确定问题进程
- 2.获取线程信息
- 3.转换线程ID为十六进制
- 4.获取线程堆栈
- 5.分析代码
- 6.性能分析工具
- [7. 查看GC日志](#7. 查看GC日志)
- 8.检查系统资源
- 总结
0 前言
本篇是本人认为最实用的一篇,在日常开发运维工作中,经常遇到CPU较高的情况,一开始时还不知道怎么定位是哪个方法导致了CPU过高,一头雾水,无法定位问题,本文详细介绍如何定位CPU过高的问题修改。
1.确定问题进程
首先,使用top命令找出占用CPU较高的java进程:
bash
top
找到对应的进程ID号
2.获取线程信息
使用top -Hp 命令查看该进程内各个线程的CPU占用情况。
bash
top -Hp <PID>
记录下占用CPU较高的线程ID
3.转换线程ID为十六进制
使用printf命令将线程ID 19664 转换为十六进制,结果4X4cd0。
bash
printf "%x\n" <线程ID>
4.获取线程堆栈
使用jstack命令获取进程的线程堆栈信息:
5.分析代码
根据堆的信息,查看相关的java代码。以上是一些可能导致CPU飙升的代码示例:
实战案例:
死循环1:
频繁垃圾回收2:
不当的线程同步3:
密集的计算机计算指标4:
6.性能分析工具
可以使用诸如Arthas、JProfile等Java性能分析工具进行更深入的分析。
7. 查看GC日志
如果怀疑GC问题,可以查GC日志。
bash
jstat -gcutil <PID> 1000
8.检查系统资源
使用vmstat、iostat等命令检查系统资源使用情况,排除是否为系统资源问题通过以上步骤,我们可以定位到导致CPU飙高的具体代码位置,然后进行相应的优化。常见的优化方法包括:优化算法、增加缓存、调整线程池参数、优化数据库查询等。在进行优化时,要注意进行充分的测试,以确保修改不会引入新的问题。
总结
本章的标题是告别重启大法,就是我们以后遇到问题后,已经知道怎么取定位以及解决问题了,不再是稀里糊涂的把系统重启后,反复出现问题。