1.背景
在java中,我们会经常预告线上环境高CPU的情况,对于java程序员来说,掌握高CPU的定位和处理十分有必要
2. 高CPU一般的原因
- full GC 频繁,导致GC线程消耗大量的CPU
- 线程中出现死循环
3.如何定位高CPU的线程
@Component
public class HighCpuService implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
Thread thread = new Thread(() -> {
while (true) {
String demo = new String("highCup");
System.out.println(demo);
}
}, "highCpuThread");
thread.start();
}
}```
- 使用top找到占用率高的java进程
![file](https://img-blog.csdnimg.cn/20200403181329441.png)
- 使用top -Hp pid找到占用率高的线程
![file](https://img-blog.csdnimg.cn/20200403181329679.png)
- printf “%x\n” 31822 将线程id转成16进制
![file](https://img-blog.csdnimg.cn/20200403181329936.png)
- 使用jstack pid | grep -A10 7c4e
![file](https://img-blog.csdnimg.cn/20200403181330326.png)
- jstack 命令用于查看java线程的栈信息
- grep用于过滤信息
- -A10表示搜索到7c4e之后向下显示10行
- 根据栈中相关的信息(线程名称:例如highCpuThread)定位代码中的问题
- GC频繁
- 出现死循环