Skip to content

面试速答(先看这里)

**一句话结论:**我们可以通过实验验证上面的结论,以下实验在8C16G的物理机上实现。

60秒标准回答:

死循环会导致CPU使用率升高 。当代码中出现死循环时,涉及的线程会不断执行循环中的指令而不会退出,因此会持续占用处理器资源。这种情况下,CPU会花费所有可用的时间片去执行这个无尽的循环,导致几乎没有资源剩余来处理其他任务或线程

Talk Is Cheap,Show Me The Code!!!

我们可以通过实验验证上面的结论,以下实验在8C16G的物理机上实现。内存total=15g,14g可用,因为有1g是因为Linux内核分配给SLAB了

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**死循环会导致CPU使用率升高 。
  • **要点2:**没有跑以上代码之前的CPU使用率下图所示, us 代表用户态1%, sy 代表内核态0.5%。
  • **要点3:**运行代码后,CPU使用率 us 和 sy 都有升高,同时进程列表中的java进程CPU使用一列也大幅度升高。
  • **要点4:**注意:俩个java进程,一个是IDEA编译器的,一个是通过IDEA启动的测试代码,由于死循环疯狂在IDEA控制台输出系统时间戳,导致IDEA的CPU使用率也升高了。
  • **要点5:**如果把死循环输出的那一行注释掉,可以看到只有 us 用户态的使用率升高了,同时IDEA的进程使用率不会升高。

**记忆锚点:**CPU → IDEA → java → SystemcurrentTimeMillis → Systemoutprintln → 来处理其他任务或线程

关键取舍:

  • 当代码中出现死循环时,涉及的线程会不断执行循环中的指令而不会退出,因此会持续占用处理器资源。
  • 这种情况下,CPU会花费所有可用的时间片去执行这个无尽的循环,导致几乎没有资源剩余来处理其他任务或线程。

易错提醒:

  • 注意:俩个java进程,一个是IDEA编译器的,一个是通过IDEA启动的测试代码,由于死循环疯狂在IDEA控制台输出系统时间戳,导致IDEA的CPU使用率也升高了。

加分表达:

  • 我们可以通过实验验证上面的结论,以下实验在8C16G的物理机上实现。
  • 如果把死循环输出的那一行注释掉,可以看到只有 us 用户态的使用率升高了,同时IDEA的进程使用率不会升高。

追问准备:

  • 围绕「CPU」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「IDEA」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「java」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

死循环会导致CPU使用率升高。当代码中出现死循环时,涉及的线程会不断执行循环中的指令而不会退出,因此会持续占用处理器资源。这种情况下,CPU会花费所有可用的时间片去执行这个无尽的循环,导致几乎没有资源剩余来处理其他任务或线程。

Talk Is Cheap,Show Me The Code!!!

我们可以通过实验验证上面的结论,以下实验在8C16G的物理机上实现。内存total=15g,14g可用,因为有1g是因为Linux内核分配给SLAB了。

编写死循环代码:

plain
public class Main {
    public static void main(String[] args) {
        while (true){
            System.out.println(System.currentTimeMillis());//死循环输出系统时间戳,强制产生2个系统调用,可以看到CPU us 和sy 占比都会升高
        }
    }
}

没有跑以上代码之前的CPU使用率下图所示,us代表用户态1%,sy代表内核态0.5%。

原图片资源已失效

运行代码后,CPU使用率 us和sy都有升高,同时进程列表中的java进程CPU使用一列也大幅度升高。

> 注意:俩个java进程,一个是IDEA编译器的,一个是通过IDEA启动的测试代码,由于死循环疯狂在IDEA控制台输出系统时间戳,导致IDEA的CPU使用率也升高了。

原图片资源已失效

如果把死循环输出的那一行注释掉,可以看到只有us用户态的使用率升高了,同时IDEA的进程使用率不会升高。原因是System.out.println()和System.currentTimeMillis()都会产生系统调用进入内核态,注释掉代码后,while死循环只是用户态的程序代码,不需要进入内核态了。

原图片资源已失效