CPU飙升100%怎么办?字节跳动面试官告诉你答案!

2024-06-22 20:04

本文主要是介绍CPU飙升100%怎么办?字节跳动面试官告诉你答案!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小北说在前面

CPU占用率突然飙升是技术人员常遇到的一个棘手问题,它是一个与具体技术无关的普遍挑战。

这个问题可以很简单,也可以相当复杂。

有时候,只是一个死循环在作祟。
有时候,是死锁导致的。
有时候,代码中有不必要的同步块。
有时候,是大量计算密集型任务在运行。
有时候,是线程数过多引起的。
有时候,是频繁的上下文切换。
有时候,是内存不足的问题。
有时候,是频繁的垃圾回收。
有时候,是内存泄漏导致的。
等等。

导致CPU占用率飙升的问题多种多样,不同系统中的不同场景,其原因可能各不相同。

在这里,小北将对这些问题进行系统化、体系化的梳理,帮助大家在实际工作和面试过程中能够清晰、有条理地分析和解决CPU占用率过高的问题

插播一条:真的免费,如果你近期准备面试跳槽,建议在cxykk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题、简历模板、算法刷题。

一、cpu占用很高的3大类型,9大场景

1.1业务类问题

1.1.1 死循环

死循环是指程序在特定条件下进入了一个无限循环,无法跳出,导致CPU资源被完全占用。

例如:我们有一段代码用来检查文件的更新状态,但由于逻辑错误,条件永远无法满足,结果程序进入了死循环。

while (true) {if (file.isUpdated()) {break;}
}
1.1.2 死锁

死锁是指两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行,CPU资源被消耗殆尽。


发生死锁后,就会存在忙等待或自旋锁等编程问题,从而导致 繁忙等待问题,从而导致 CPU 100%

1.1.3 不必要的代码块

一些冗余、不必要的代码块在运行时占用了大量的CPU资源。

例如,不需要的地方使用synchronized块。

public synchronized void unnecessarySync() {// 执行一些不需要同步的操作
}

在不需要的地方使用synchronized块,会导致线程竞争和上下文切换

1.2、并发类问题

1.2.1 大量计算密集型的任务

大量计算密集型任务在同一时间运行,会导致CPU资源被完全占用。

例如:在数据分析或科学计算中,多个计算密集型任务同时运行

1.2.2 大量并发线程

统中存在大量并发线程,线程切换频繁,导致CPU资源被大量消耗在上下文切换上

例如:Web服务器同时处理大量请求,每个请求都创建一个新线程

解决方案:使用线程池来限制并发线程数量

1.2.3 大量的上下文切换

当系统中存在大量线程时,CPU在不同线程间频繁切换,导致性能下降

例如:一个程序中开启了数百个线程,每个线程都在不断进行I/O操作

for (int i = 0; i < 1000; i++) {new Thread(new IOHandler()).start();
}

线程是很宝贵的资源,开启线程一定要合理的控制线程数量

3、内存类问题

1.3.1 内存不足

当系统内存不足时,就会将磁盘存储作为虚拟内存使用,而虚拟内存的运行速度要慢得多。

例如:直接一次性加载一个非常大的文件到内存中,导致内存不足

byte[] largeData = Files.readAllBytes(Paths.get("largeFile.txt"));

这种过度的分页和交换会导致 CPU 占用率居高不下,因为处理器需要花费更多时间来管理内存访问,而不是高效地执行进程。

解决方案:优化内存使用,采用流式处理避免一次性加载大文件

try (BufferedReader reader = Files.newBufferedReader(Paths.get("largeFile.txt"))) {String line;while ((line = reader.readLine()) != null) {// 处理每一行数据}
}
1.3.2 频繁GC

频繁的垃圾回收(GC)操作会占用大量CPU资源,导致性能下降。

例如:程序中频繁创建和销毁对象,导致GC频繁触发

for (int i = 0; i < 1000000; i++) {String temp = new String("temp" + i);
}

解决方案:优化对象创建和销毁,减少临时对象的生成。

1.3.4 内存泄漏

内存泄漏导致可用内存逐渐减少,最终触发频繁的GC操作,占用大量CPU资源

例如:某个数据结构中不断添加对象,却从未删除,导致内存泄漏

List<Object> list = new ArrayList<>();
while (true) {list.add(new Object());
}

解决方案:定期清理不再使用的对象,使用合适的数据结构

插播一条:真的免费,如果你近期准备面试跳槽,建议在cxykk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题、简历模板、算法刷题。

这么多会导致CPU飙升100%的原因,那么该如何解决呢?
有没有一个标准的套路,可以帮助我快速定位呢?

答案是;当然有

二、CPU 飙升100%的解决思路和方法论

2.1 使用jstack 解决CPU 100%问题


使用jstack 解决 CPU 100%问题,在方法论上要用到的两个核心命令

  • top 命令查看TOP N线程,
  • jstack命令查看堆栈信息
2.1.1 确定Java进程ID

首先,需要找到CPU占用高的Java进程的PID(进程ID)。可以使用 top 或 ps 命令来找到该进程。

top -H -p <PID>
2.1.2 找到占用CPU高的线程ID

在 top 的输出中,按 P 键可以按CPU使用率排序,找到使用CPU最多的线程。
记下这些线程的ID(nid),这些ID是十进制的。

2.1.3 将线程ID转换为十六进制

jstack 输出的线程ID是十六进制的,因此需要将找到的高CPU使用率的线程ID转换为十六进制。可以使用 printf 命令:

printf "%x\n" <thread_id>
2.1.3 使用 jstack 生成线程快照

使用 jstack 命令生成Java进程的线程快照:

jstack -l <PID> > thread_dump.txt
2.1.4 分析线程快照

在生成的 thread_dump.txt 文件中,查找转换后的十六进制线程ID。可以使用 grep 命令:

grep "0x<hex_thread_id>" thread_dump.txt -A 20

这将显示包含该线程ID的线程栈信息。分析这些线程栈,找到可能导致CPU高占用的代码

2.2 使用阿里开源Arthas性能监控工具

Arthas 是一款强大的 Java 诊断工具,能够帮助开发人员快速定位和解决 CPU 100% 的问题

使用arthas解决CPU 100%问题,在方法论上要用到两个核心命令:

  • dashboard 命令查看TOP N线程,
  • thread 命令查看堆栈信息
2.2.1. 安装和启动 Arthas

安装 Arthas
通过 curl 命令下载并安装 Arthas:

curl -O https://arthas.aliyun.com/arthas-boot.jar

注意:在生产环境中,我们一般是选择其中一台机器开启Arthas监控,因为使用 Arthas 对系统性能会有一定影响

2.2.2 启动 Arthas

启动目标 Java 应用程序,然后在终端中运行:

java -jar arthas-boot.jar

Arthas 会显示当前运行的 Java 进程列表,选择要诊断的 Java 进程:例如输入1显示如下

2.2.3 使用 dashboard 命令查看系统概况

连接到目标进程后,使用 dashboard 命令查看系统的整体性能概况,包括 CPU 使用情况

dashboard

2.2.4 使用 thread 命令定位高 CPU 线程

查看线程列表
使用 thread 命令查看所有线程的信息,并找出 CPU 使用率高的线程

thread -n 3

这个命令会显示 CPU 使用率最高的 3 个线程,输出中会包含每个线程的 ID 和名称

2.2.5 查看具体线程的堆栈信息

假设你发现线程 ID 为 8 的线程 CPU 使用率很高,可以进一步查看该线程的堆栈信息:

thread 8

该命令会显示线程 8 的详细堆栈信息,帮助你定位到具体的代码位置

插播一条:真的免费,如果你近期准备面试跳槽,建议在cxykk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题、简历模板、算法刷题。

三、总结

工具的选择建议使用arthas,它还有很多的功能在实际中很有用

感兴趣的同学可以自行前往官网学习了解:https://arthas.aliyun.com/doc/

需要注意的是:大家在面试的时候如果遇到cpu被打满该如何排查这样的问题,千万不要上来就回答使用arthas来定位问题。

在生产环境中出现问题时,我们第一时间要做的是解决问题,所以回答要符合实际场景,不然面试官一听,就知道你是背的八股文。

那么该如何回答呢?

生产中如果出现 CPU 飙升100% 的情况

  1. 先确定前一天或者最近是否有新版本发布或者依赖域的服务有新版本发布,有的话第一时间回滚。
  2. 如果最近或很长一段时间都没有新版本发布,那就先申请紧急扩容,增加机器

最后才是通过文本的这一套套路排查具体的原因分析和解决方案

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

真的免费,如果你近期准备面试跳槽,建议在cxykk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题、简历模板、算法刷题

这篇关于CPU飙升100%怎么办?字节跳动面试官告诉你答案!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085271

相关文章

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

Java代理-动态字节码生成代理的5种方式

上篇讲到了代理模式出现的原因,实现方式以及跟其他相似设计模式的区别。传送门@_@ http://blog.csdn.net/wonking666/article/details/79497547 1.静态代理的不足 设计模式里面的代理模式,代理类是需要手动去写的。但是手写代理的问题颇多 1.如果不同类型的目标对象需要执行同样一套代理的逻辑,比如说在方法调用前后打印参数和结果,那么仍然需要为每

Service在Android中的作用:技术难点、面试官关注点、回答吸引力与代码举例

在Android开发中,Service是一个重要的后台服务组件,它允许应用程序在后台执行长时间运行的操作,而无需与用户进行直接交互。Service在多种场景下发挥着关键作用,下面我们将从技术难点、面试官关注点、回答吸引力和代码举例四个方面,对Service的作用进行详细阐述。 一、技术难点 生命周期管理:Service的生命周期相对独立,与Activity和Fragment等组件不同。因此

关于CPU的一点知识

首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和

Linux平台与Windows平台字节对齐(一)

记录时间:2014-10-20 20:31 今天白天在整理 winndows平台 + Arm平台的网络数据包。但期间由于经验不足,不了解两平台CPU架构的差距会影响到数据类型的大小,导致在工程非常紧急的时间里还浪费了很多宝贵的时间,鉴于问题的常见性 和 隐秘行,特此列出,以便能帮助需要帮助的人。 解决问题思路:在遇到网络交互数据不对时,可以从如下四方面去排除问题,通常只要使用这三种

C++系统相关操作4 - 获取CPU(指令集)架构类型

1. 关键词2. sysutil.h3. sysutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词: C++ 系统调用 CPU架构 指令集 跨平台 实现原理: Unix-like 系统: 可以通过 uname -m 命令获取 CPU 架构类型。Windows 系统: 可以通过环境变量 PROCESSOR_ARCHITECTURE 获取 CPU 架构类型。

华为面试题及答案——机器学习(一)

(1). 线性回归普通最小二乘法运用的经典基本假设有哪些? 线性回归中,普通最小二乘法(Ordinary Least Squares, OLS)是一种常用的估计方法。 线性关系假设: 假设自变量(X)与因变量(Y)之间存在线性关系。即,模型可以表示为 Y=β0+β1X1+β2X2+...+βnXn+ϵY = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... +