这个问题可以说是 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 都很清楚了。

公众号:古时的风筝

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

  1. Java程序占用 CPU 过高怎么排查

    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...

  2. Java占Linux超过xms,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  3. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  4. java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查

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

  5. weblogic占用java_weblogic下java程序占用cpu过高的问题排查

    1.cpu使用情况如图: 2.执行命令 :jstack 126624 > cpu1112.log   (注意执行此命令时的用户需为执行进程的用户,所以此处需要用weblogic用户) 若执行此命 ...

  6. weblogic下java程序占用cpu过高的问题排查

    1.cpu使用情况如图: 2.执行命令 :jstack 126624 > cpu1112.log   (注意执行此命令时的用户需为执行进程的用户,所以此处需要用weblogic用户) 若执行此命 ...

  7. java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决

    我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...

  8. windows下揪出java程序占用cpu很高的线程

    背景 天天搞java,这些监控也都知道,用过,但也没往细里追究.因为也没碰见这种问题,这次还是静下来走一遍流程吧.与网上基本一致,不过我区分了下linux和windows的不一样.我感觉基本是程序写成 ...

  9. Windows服务器java.exe占用CPU过高问题分析及解决

    原文路径:https://blog.csdn.net/ningzuobei/article/details/48828915 最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,C ...

最新文章

  1. 放弃“for循环”,教你用这种算法 !(附代码)
  2. 你在听音乐的时候能否感受到背后有“寒意“?
  3. git使用教程问题列表
  4. 「前端工程化」该怎么理解?
  5. AtCoder Grand Contest 023 C - Painting Machines
  6. 聊天室程序python_Python聊天室程序(基础版)
  7. 深入理解ThreadLocal变量的功能和使用
  8. 远端仓库初始化成裸仓库 git init --bare
  9. sql重复数据只保留一条_一条SQL完成跨数据库实例Join查询
  10. Implement Stack using Queues
  11. 微信小程序底部导航栏未读消息出现小红点的实现
  12. 2022年CCNA面试题库和答案
  13. LSB图像数字水印嵌入算法(含python代码)
  14. Asp.Net Core 系列教程 (三)身份认证
  15. 谷歌云端硬盘下载文件_如何为Google云端硬盘上的文件创建共享下载链接
  16. 使用钩子函数获取全部的鼠标消息和键盘消息
  17. cmd设置总是置顶_怎么将想要的窗口一直置顶 原来只要这简单的一步
  18. 西门子S7-1500PLC与西门子V90 PN伺服通讯控制项目程序项目程序
  19. 蓝鲸智云环境搭建(1)
  20. 华钜同创:亚马逊Listing优化关联营销设置技巧

热门文章

  1. STM32 进阶教程 10 - RAM中调试程序
  2. 二十、SPI设备驱动及应用(一)
  3. 考前自学系列·计算机组成原理·常见的数据寻址方式(地址码,操作数位置)
  4. JS关于时间的一些计算与获取
  5. JS 面向对象与原型
  6. LinkedList模拟队列和堆栈
  7. linux 进程(二) --- 进程的创建及相关api
  8. Android activity 参数传递
  9. Linux下Oracle 10.2.0.1升级到10.2.0.4总结
  10. SBO用户清理(最近一直未登录过用户)