这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的。线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因?

这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅能解决面试官,还能解决问题。不然真的就掉进套路里了。

当我们真碰到这个问题的时候应该怎么排查呢?

模拟一个高 CPU 场景

先用一段程序创建几个线程,将其中一个线程设置成高 CPU 使用率的。

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {

Thread thread = new Thread(() -> {

System.out.println(Thread.currentThread().getName());

try {

Thread.sleep(30 * 60 * 1000);

}catch (Exception e){

e.printStackTrace();

}

});

thread.setName("thread-" + i);

thread.start();

}

Thread highCpuThread = new Thread(() -> {

int i = 0;

while (true) {

i++;

}

});

highCpuThread.setName("HighCpu");

highCpuThread.start();

}

运行这段程序后,前面 10 个线程都处于休眠状态,只有最后一个线程会持续的占用 CPU 。

运行这段程序,然后就可以开始一些列的操作来发现问题原因了。

排查步骤

第一步,使用 top 找到占用 CPU 最高的 Java 进程

在真实环境中,首先要确认是不是 Java 程序造成的,如果有系统监控工具,可能会直接在预警信息里告诉你是有哪个进程造成的,但也有可能不知道,需要我们手动排查。

如果是在面试场景中,这个问题可能不需要确认,毕竟 Java 面试,面试官可能直接就告诉你是 Java 占用的 CPU 过高。

这一步也非常简单,就是一个 top命令而已,基本上所有同学都用过这个命令吧。

使用 top命令发现占用 CPU 99.7% 的线程是 Java 进程,进程 PID 为 13731。

第二步,用 top -Hp 命令查看占用 CPU 最高的线程

上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。

执行top -Hp pid命令,pid 就是前面的 Java 进程,我这个例子中就是 13731 ,完整命令为:

top -Hp 13731,执行之后的效果如下

可以看到占用 CPU 最高的那个线程 PID 为 13756。

然后将 13756转换为 16 进制的,后面会用到,可以用在线进制转换的网站直接转换,转换结果为 0x35bc

第三步,保存线程栈信息

当前 Java 程序的所有线程信息都可以通过 jstack命令查看,我们用jstack命令将第一步找到的 Java 进程的线程栈保存下来。

jstack 13731 > thread_stack.log

第四步,在线程栈中查找最贵祸首的线程

第二步已经找到了这个罪魁祸首的线程 PID,并把它转换成了 16 进制的,第三步保存下来的线程栈中有所有线程的 PID 16 进制信息,我们在线程栈中查找这个16进制的线程 id (0x35bc)。

怎么样,现在一目了然了,线程名称、线程状态、以及哪行代码消耗了最多的 CPU 都很清楚了。

公众号:古时的风筝

java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查相关推荐

  1. window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是 ...

  2. java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?

    问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...

  3. java 关注公众号没有调接口_高频面试题:接口和抽象类的区别

    作为一个基础的Java高频面试题,是所有Java面试者必须烂熟于心的.当然不能死记硬背,可以通过实际地写几个小demo,边实际操作边理解,既能感受到编程的快乐,更重要的是真的理解记住了二者的区别. 此 ...

  4. java工程如何跑起来的_你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至 ...

  5. java 指定垃g1圾收集_【译】Java 14 Hotspot 虚拟机垃圾回收调优指南

    本文主要包括以下内容:优化目标与策略(Ergonomics) 垃圾收集器实现(Garbage Collector Implementation) 影响垃圾收集性能的因素总堆(Total Heap) 年 ...

  6. cpu怎么超频_小白秒变高手 Intel酷睿CPU一键超频就是这么简单

    说到DIY,玩家们追求的主要目标就是将性能尽可能最大化,比如处理器的核心数.高频就是两个主要方向.当然了,买到手的CPU核心数量是一定的,不可能再改变,那就只有提升频率了,OC超频就是这么来的,自己动 ...

  7. java开发面试自我介绍模板_(自我介绍范文)java面试自我介绍

    1 java 面试自我介绍 java 技术具有卓越的通用性,高效性,平台移植性和安全性,当今已广泛应用于各种电子设备和互联网, 因此 java 公司具备了广泛的优势和广阔的发展前景.下面百分网为大家整 ...

  8. java实验报告金陵科技学院_金陵科技学院java

    <Java语言程序设计>学生信息管理_理学_高等教育_教育专区.学生信息管理系统,金陵科技学院 <Java 语言程序设计>课程考查报告 题 目: 学生信息管理程序 学生姓名.. ...

  9. h5 bootstrap 小程序模板_一道面试题小程序与H5的区别

    抛砖 此文是一道面试题,又不仅仅是一道面试题 面试题,在各个技术社区里都是一个永不落伍的话题,好像大多数人临面试前都会狂刷面试题,恨不得把所有面试题都看一遍,要说有用没,当然有用,因为大部分面试题确实 ...

最新文章

  1. python基础:购物车的简单实现
  2. SQL 基础-- 子查询
  3. 中科院分词系统(NLPIR)JAVA简易教程
  4. C#中在窗体应用中使用StringBuilder拼接显示网页
  5. ccf报数游戏java_ccf 201712 02 (游戏)
  6. php无刷新跳转,用#号实现web页面的无刷新跳转
  7. 让你人际关系更上一层楼的26条原则
  8. 页面内部DIV让点击外部DIV 事件不发生(阻止冒泡事件)
  9. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)
  10. Linux LVM动态扩容
  11. 数据定义约束-数据库习题
  12. 【腾讯TMQ】老司机教你如何优雅地完成一个小项目测试
  13. 中英文代码对比之ZLOGO 4 LOGO
  14. 计算机系女生电脑买什么牌子,适合女生的笔记本电脑 大学女生买什么电脑好...
  15. 在线考试系统_管理员端
  16. 用计算机控制操作照相机,摄影教程:用电脑控制相机远程拍摄
  17. python同心圆怎么运行_怎么用python画同心圆
  18. 启用AHCI后无法启动系统
  19. C: error: incompatible types when initializing type ‘int’ using type ‘atomic_t’ {aka ‘struct <anonym
  20. 用cookie设置7天免登陆

热门文章

  1. QUANT[1]:从零开始量化交易
  2. 西南科技大学Linux实验名称:实验二 Linux环境网络管理
  3. Java 基础语法(1)- 注释、标识符、关键字
  4. MP2451 使能脚电阻判断
  5. 【正点原子STM32连载】第五十三章 DSP测试实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  6. BUUCTF Web [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http
  7. [Android][设置最小(大)宽高]
  8. 主播直播间抖音电商脚本运营话术模板表格方案管理计划
  9. Android从零单排之免费短信验证
  10. css3中的景深,3d,和动画效果