主题
面试速答(先看这里)
**一句话结论:**我们可以通过实验验证上面的结论,以下实验在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死循环只是用户态的程序代码,不需要进入内核态了。
原图片资源已失效