Java面试题之cpu占用率100%,进行定位和解决

简介: 这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。

导言

Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下三个步骤:

  1. 找到最耗CPU的进程
  2. 找到这个进程中最耗CPU的线程
  3. 使用jdk自带工具jstack 查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

一、找到最耗CPU的进程

通过top命令查看进程的cpu占用情况,运行top命令后再键入P(大写p)(或者是 shift + p ),进程会按照CPU使用率排序,如下图:
在这里插入图片描述

由上图可以看到,最耗CPU的进程PID为2601,CPU使用率达到了100%

二、找到这个进程中最耗CPU的线程

可以使用top命令:top -Hp ${进程的PID}
也可以使用ps命令:ps -mp ${进程的PID} -o THREAD,tid,time

  • -p:指定特定的pid进程号进行观察
  • -H

我们以top命令为例:
top -Hp 2601
运行以上命令后再键入P(大写p),线程会按照CPU使用率排序,如下图:
在这里插入图片描述

可以看到进程2601的最耗CPU的线程PID为2611,CPU使用率达到了99.9%

三、查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

堆栈里,线程id是用16进制表示的,所以需要将线程PID转化为16进制(也可以用在线进制转换的网站直接转换):

printf "%x" 2611 
输出:a33

打印进程堆栈信息(注意2601是进程的PID),通过线程id,过滤得到线程堆栈:
jstack 2601 | grep a33 -A 20

输出的信息如下:
在这里插入图片描述
由此可以看到,最耗CPU的代码为CpuUseTest.java代码中的第9行,也就是执行无限循环的代码块所在的位置。

直此导致该应用CPU偏高的问题,被成功定位。

四、查看堆栈信息中遇到的问题

刚开始查看堆栈信息的时候,使用了如下命令(请跟上面的命令对比一下,看看有什么不同):
jstack 2611 | grep a33 -A 20
结果报错:
在这里插入图片描述
是的,我把该写进程PID的地方,写成了线程PID,找了一圈,才解决这个问题,也耗费了不少时间。

五、top命令的常用方式

top命令的常用方式

相关文章
|
9月前
|
SQL 监控 关系型数据库
【紧急救援】MySQL CPU 100%!一套组合拳教你快速定位并解决!
凌晨三点MySQL CPU飙至100%,业务瘫痪!本文亲历30分钟应急排障全过程:从紧急止血、定位慢查询、分析锁争用,到优化SQL与索引,最终恢复服务。总结一套可复用的排查路径与预防方案,助你告别深夜救火。
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
3266 4
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1380 166
|
搜索推荐 Java 定位技术
Java实现利用GeoLite2-City.mmdb根据IP定位城市的方法
在城市,国家,地区等地理位置数据获取之后,你可以依指定的业务需求,来进行进一步的数据处理。例如,你可以设计一个应用,根据用户的 IP 地址来个性化地展示内容,或者用于分析网络请求的来源等。
2299 20
|
监控 C#
【Function App】如果一个拥有多个Function App的Plan遇见了High CPU问题? 如何方便定位是哪一个Function App引发的呢?
在Azure Function App测试中,若多个Function App共用同一App Service Plan资源,当出现High CPU问题时,由于Function App公开指标无法直接观测CPU状态,可通过启用Application Insights解决。其Live Metrics功能可过滤并查看每个Function App的CPU使用情况。具体步骤为:将所有Function App连接至同一Application Insights资源,进入Live Metrics页面按Role筛选监控数据。附有三段C#代码示例,分别展示占用CPU、Memory及普通功能的实现方法。
348 36
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
411 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
392 6