JVM高CPU调优

1.背景

在java中,我们会经常预告线上环境高CPU的情况,对于java程序员来说,掌握高CPU的定位和处理十分有必要

2. 高CPU一般的原因

  • full GC 频繁,导致GC线程消耗大量的CPU
  • 线程中出现死循环

3.如何定位高CPU的线程

  • 创建demo模拟高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频繁
  - 出现死循环
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值