CPU 使用率100%的常见原因及解决方案

一、Java应用导致CPU 100%的主要原因

1. 代码层面的问题

  • 无限循环/死循环

    java

    复制

    下载

    while (true) { 
        // 缺少退出条件
    }
  • 递归调用未终止

    java

    复制

    下载

    public void recursive() {
        recursive(); // 无限递归
    }

2. 线程问题

  • 线程阻塞竞争

    java

    复制

    下载

    synchronized(lock) {
        while (!condition) { // 条件永远不满足
            // 空循环消耗CPU
        }
    }
  • 线程池配置不当

    java

    复制

    下载

    Executors.newCachedThreadPool(); // 无限制创建线程

3. 算法效率低下

  • 高时间复杂度算法

    java

    复制

    下载

    // O(n^3)的嵌套循环
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                // 复杂计算
            }
        }
    }

二、诊断CPU 100%的步骤

1. 定位高CPU线程

bash

复制

下载

# 1. 查找Java进程PID
top -c
# 2. 查看线程CPU占用
top -H -p <PID>
# 3. 将线程ID转为16进制
printf "%x\n" <线程ID>

2. 获取线程堆栈

bash

复制

下载

jstack <PID> > thread_dump.log
# 或在堆栈中直接查找
jstack <PID> | grep -A 20 <16进制线程ID>

3. 使用Arthas实时诊断

bash

复制

下载

# 监控最忙的线程
thread -n 3
# 监控方法执行时间
trace com.example.Class method