Java 应用程序的 CPU 使用率飙升原因分析

Java 应用程序的 CPU 使用率飙升原因分析

1、背景

在服务器上执行某个任务时,系统突然运行缓慢,top 发现cpu飙升,一度接近100%,最终导致服务假死。

2、CPU 使用率怎么计算?

CPU% = 1 – idleTime / sysTime * 100

  • idleTime:CPU处于空闲状态的时间
  • sysTime:CPU处于用户态和内核台的时间总和

3、问题分析

#查看所有进程占系统cpu的排序,极大可能排第一的就是自己的java进程,pid就是进程号。1、top #查看java进程下的所有线程占cpu情况。2、top -Hp 进程id #可查看进程堆栈信息3、jstack 进程号 -F当正常输出的请求不被响应时,强制输出线程堆栈-m如果调用到本地方法的话,可以显示C/C++的堆栈-l除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况#查找某进程下-》线程id(jstack堆栈信息中的nid)=0xa的线程状态4、jstack 进程号 | grep 线程id最后可以把对应堆栈信息导入到log中,进行分析

jstack命令查看对应进程的堆栈信息

3、可能导致的原因

计算密集型的程序是比较耗 CPU 使用率的1、频繁GC,访问量高时,有可能造成频繁的YGC、甚至FGC。当调用量大时,内存分配过快,就会造成GC线程不停的执行,导致CPU飙高2、代码中有大量消耗CPU的操作,导致CPU过高,系统运行缓慢; #例如某些复杂算法,甚至算法BUG,无限循环递归等等 3、由于锁使用不当,导致死锁4、序列化与反序列化,后文中举了一个真实的案例,程序执行xml解析的时,调用量增大的情况下,导致了CPU被打满5、加密、解密6、正则表达式校验,曾经线上发生一次血案,正则校验将CPU打满。大概原因是:Java 正则表达式使用的引擎实现是 NFA 自动机,这种引擎在进行字符匹配会发生回溯(backtracking)7、线程上下文切换、当启动了很多线程,而这些线程都处于不断的阻塞状态(锁等待、IO等待等)和执行状态的变化过程中。当锁竞争激烈时,很容易出现这种情况

4、常见的一些问题(来源于其他大佬的总结)

4-1.while的无限循环会导致CPU使用率飙升吗?

是。

首先,无限循环将调用CPU寄存器进行计数,此操作将占用CPU资源。那么,如果线程始终处于无限循环状态,CPU是否会切换线程?

除非操作系统时间片到期,否则无限循环不会放弃占用的CPU资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行任何其他操作。

4-2.频繁的Young GC会导致CPU占用率飙升吗?

是。

Young GC本身就是JVM用于垃圾收集的操作,它需要计算内存和调用寄存器。因此,频繁的Young GC必须占用CPU资源。

让我们来看一个现实世界的案例。for循环从数据库中查询数据集合,然后再次封装新的数据集合。如果内存不足以存储,JVM将回收不再使用的数据。因此,如果所需的存储空间很大,您可能会收到CPU使用率警报。

4-3.具有大量线程的应用程序的CPU使用率是否较高?

不是。

如果通过jstack检查系统线程状态时线程总数很大,但处于Runnable和Running状态的线程数不多,则CPU使用率不一定很高。

我遇到过这样一种情况:系统线程的数量是1000+,其中超过900个线程处于BLOCKED和WAITING状态。该线程占用很少的CPU。

但是大多数情况下,如果线程数很大,那么常见的原因是大量线程处于BLOCKED和WAITING状态。

4-4.对于CPU占用率高的应用程序,线程数是否较大?

不是。

高CPU使用率的关键因素是计算密集型操作。如果一个线程中有大量计算,则CPU使用率也可能很高。这也是数据脚本任务需要在大规模集群上运行的原因。

4-5.处于BLOCKED状态的线程是否会导致CPU占用率飙升?

不会。

CPU使用率的飙升更多是由于上下文切换或过多的可运行状态线程。处于阻塞状态的线程不一定会导致CPU使用率上升。

4-6.如果分时操作系统中CPU的值us或sy值很高,这意味着什么?

可以使用命令查找CPU的值us和sy值top,如以下示例所示:

us:用户空间占用CPU的百分比。简单来说,高我们是由程序引起的。通过分析线程堆栈很容易找到有问题的线程。

sy:内核空间占用CPU的百分比。当sy为高时,如果它是由程序引起的,那么它基本上是由于线程上下文切换。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年7月13日 09:21
下一篇 2022年7月13日 09:21

相关推荐

  • 怎么转行总结出成功转行的3个步骤

    01 前段时间,由麦可思研究院发布的《就业蓝皮书:2019年中国大学生就业报告》显示,2018大学毕业生半年内的离职率为33%,主动离职的主要原因是“个人发展空间不够”和“薪资福利…

    2022年11月26日
  • 中国疫情为何突然严重了(大连疫情为何突然增加那么多)

    有在关注国内此次疫情的小伙伴应该注意到了,近期国内各地的疫情情况也都是比较严峻的。而对于进入十一月份后各地突然爆发的疫情,大家也都第一时间查询原因。中国疫情为何突然严重了?为什么国…

    2022年11月25日
  • 为什么北京疫情越来越严重(疫情为什么越控制越严重)

    有在关注北京疫情的小伙伴应该注意到了,这几天北京疫情的新增数据情况也开始越发的严重起来,大家对北京此次疫情发展情况也都不断分析。为什么北京疫情越来越严重?导致北京本轮疫情的原因是什…

    2022年11月25日
  • 5+3疫情防控从哪天开始算(辽宁疫情防控最新政策)

    最近有关国内各地的疫情大家也都有在持续关注,目前国内各地疫情隔离时间也根据二十条防控措施有了新的调整。那么,5+3疫情防控从哪天开始算?对于密接的5+3隔离时间计算大家还是比较关心…

    2022年11月25日
  • 蓝码怎么变绿码需要几天(蓝码怎么变绿码需要几天)

    大家都知道健康码的颜色有红码、绿码、黄码,近日湖南健康码上线“蓝码”,不少小伙伴发现自己健康码变蓝了,都想赶紧恢复绿码,那么蓝码怎么变绿码需要几天?下面小编为大家带来蓝码变绿码需要…

    2022年11月25日
  • 广州白云区疫情反弹原因是什么(白云区疫情风险等级)

    关注广州疫情的小伙伴可能有注意到,最近白云区的疫情好像又反弹了。据悉,近期广州每日新增阳性感染者持续徘徊在高位平台,疫情多点散发与局部聚集并存,本地疫情与外地输入交织叠加,防外溢压…

    2022年11月25日
  • 拼多多百亿补贴预售一般多久发货(拼多多百亿补贴预售)

    拼多多里面有很多优惠活动,其中百亿补贴活动非常火爆,一些里面的东西价格比别的平台便宜,质量也有保障,还有预售的活动,那么拼多多百亿补贴预售一般多久发货?下面小编为大家带来拼多多百亿…

    2022年11月25日
  • 北京疫情多久能解除封控(北京疫情还要多久结束)

    最近一段时间北京疫情形势备受关注,马上就要到年底了,不少人想要去北京办事,。都非常关注当地疫情相关政策,那么 北京疫情多久能解除封控?北京疫情什么时候恢复正常生活?下面小编为大家带…

    2022年11月25日
  • 淘宝直播开通后带货链接怎么做(淘宝直播需要开通淘宝店铺吗)

    直播带货无论是对于商家来说还是主播收益都是非常可观的,所以不少平台都有直播带货功能,一些小伙伴也想加入淘宝直播,那么淘宝直播开通后带货链接怎么做?下面小编为大家带来淘宝直播开通后带…

    2022年11月24日
  • cpu性能天梯图2022 AMD CPU天梯图最新排行榜出炉

    用户在DIY自己的主机时选择CPU是非常关键的,CPU可以说是电脑的大脑,大家也都想追求好一点的CPU来使用,但型号太多了,大部分的用户都不知道目前哪一款CPU比较好用,快来看看详…

    2022年11月24日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息