iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Tomcat进程占用CPU过高的解决方法
  • 444
分享到

Tomcat进程占用CPU过高的解决方法

2024-04-02 19:04:59 444人浏览 八月长安
摘要

目录案例上下文切换开销?总结CPU经常会成为系统性能的瓶颈,可能: 内存泄露导致频繁GC,进而引起CPU使用率过高 代码Bug创建了大量的线程,导致CPU频繁上下文

CPU经常会成为系统性能的瓶颈,可能:

  • 内存泄露导致频繁GC,进而引起CPU使用率过高
  • 代码Bug创建了大量的线程,导致CPU频繁上下文切换

通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如

  • JVM在峰值负载下的平均CPU利用率40%
  • CPU使用率飙到80%就可认为不正常

JVM进程包含多个Java线程:

  • 一些在等待工作
  • 另一些则正在执行任务

最重要的是找到哪些线程在消耗CPU,通过线程栈定位到问题代码
如果没有找到个别线程的CPU使用率特别高,考虑是否线程上下文切换导致了CPU使用率过高。

案例

程序模拟CPU使用率过高 - 在线程池中创建4096个线程

linux环境下启动程序:


java -Xss256k -jar demo-0.0.1-SNAPSHOT.jar

线程栈大小指定为256KB。对于测试程序来说,操作系统默认值8192KB过大,因为需要创建4096个线程。

使用top命令,我们看到Java进程的CPU使用率达到了961.6%,注意到进程ID是55790。

用更精细化的top命令查看这个Java进程中各线程使用CPU的情况:


#top -H -p 55790

可见,有个叫“scheduling-1”的线程占用了较多的CPU,达到了42.5%。因此下一步我们要找出这个线程在做什么事情。

为了找出线程在做什么,用jstack生成线程快照。
jstack输出较大,一般将其写入文件:


jstack 55790 > 55790.log

打开55790.log,定位到第4步中找到的名为 scheduling-1 的线程,其线程栈:

看到AbstractExecutorService#submit这个函数调用,说明它是Spring Boot启动的周期性任务线程,向线程池中提交任务,该线程消耗了大量CPU。

上下文切换开销?

经历上述过程,往往已经可以定位到大量消耗CPU的线程及bug代码,比如死循环。但对于该案例:Java进程占用的CPU是961.6%, 而“scheduling-1”线程只占用了42.5%的CPU,那其它CPU被谁占用了?

第4步用top -H -p pid命令看到的线程列表中还有许多名为“pool-1-thread-x”的线程,它们单个的CPU使用率不高,但是似乎数量比较多。你可能已经猜到,这些就是线程池中干活的线程。那剩下的CPU是不是被这些线程消耗了呢?

还需要看jstack的输出结果,主要是看这些线程池中的线程是不是真的在干活,还是在“休息”呢?

发现这些“pool-1-thread-x”线程基本都处WaiTING状态。

  • Blocking指的是一个线程因为等待临界区的(Lock或者synchronized关键字)而被阻塞的状态,请你注意的是处于这个状态的线程还没有拿到锁
  • Waiting指的是一个线程拿到了锁,但需等待其他线程执行某些操作。比如调用了Object.wait、Thread.join或LockSupport.park方法时,进入Waiting状态。前提是这个线程已经拿到锁了,并且在进入Waiting状态前,os层面会自动释放锁,当等待条件满足,外部调用了Object.notify或者LockSupport.unpark方法,线程会重新竞争锁,成功获得锁后才能进入到Runnable状态继续执行。

回到我们的“pool-1-thread-x”线程,这些线程都处在“Waiting”状态,从线程栈我们看到,这些线程“等待”在getTask方法调用上,线程尝试从线程池的队列中取任务,但是队列为空,所以通过LockSupport.park调用进到了“Waiting”状态。那“pool-1-thread-x”线程有多少个呢?通过下面这个命令来统计一下,结果是4096,正好跟线程池中的线程数相等。


grep -o 'pool-2-thread' 55790.log | wc -l

剩下CPU到底被谁消耗了?
应该怀疑CPU的上下文切换开销了,因为我们看到Java进程中的线程数比较多。

下面通过vmstat命令来查看一下操作系统层面的线程上下文切换活动:

cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。
那具体是哪个进程导致的呢?

停止spring Boot程序,再次运行vmstat命令,会看到in和cs都大幅下降,这就证实引起线程上下文切换开销的Java进程正是55790。

总结

遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。
其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。

到此这篇关于Tomcat进程占用CPU过高的解决方法的文章就介绍到这了,更多相关Tomcat进程占用CPU过高内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Tomcat进程占用CPU过高的解决方法

本文链接: https://www.lsjlt.com/news/131823.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Tomcat进程占用CPU过高的解决方法
    目录案例上下文切换开销?总结CPU经常会成为系统性能的瓶颈,可能: 内存泄露导致频繁GC,进而引起CPU使用率过高 代码Bug创建了大量的线程,导致CPU频繁上下文...
    99+
    2024-04-02
  • Runtimebroker.exe进程占用CPU过高的解决方法
    这篇文章主要为大家展示了“Runtimebroker.exe进程占用CPU过高的解决方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Runtimebroker.exe进程占用CPU过高的解决方...
    99+
    2023-06-27
  • linux php-fpm进程 cpu占用过高 解决方法
    主要解决思路如下: 设置控制php-fpm进程池进程数量。 修改pm.max_children的数量,根据内存来进行分配,系统开一个进程20-30M。比如系统内存1G,那就将差不多能开30个进程,所以可以设置pm.max_children ...
    99+
    2023-09-12
    linux php 服务器
  • 电脑cpu占用过高的解决方法
    电脑长时间使用后出现高CPU占用问题时应采取什么措施?。而这个时候,电脑的运转时间也会越来越十分的慢,cpu也会十分的热,而cpu发烫比较严重的过程中会巨大的减少电脑的使用期限,那麼电脑cpu占用过高怎么办呢下面让小编为各位产生电脑cpu占...
    99+
    2023-07-10
  • win7 dllhost.exe进程占用CPU过高如何解决
    win7 dllhost.exe进程占用CPU过高可能是由于系统文件损坏、病毒感染、程序冲突等原因引起的。解决此问题的方法如下:1....
    99+
    2023-10-20
    win7
  • cpu占用高的解决方法
    这篇文章主要为大家展示了“cpu占用高的解决方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“cpu占用高的解决方法”这篇文章吧。首先,我们可以尝试修改一下注册表,在电脑桌面上按下Windows...
    99+
    2023-06-28
  • Win7 32位中audiodg进程CPU占用率过高问题解决方法
      最近有用户win7 32位操作系统下使用酷狗音乐、PPS或千千静音等等播放器时,在任务管理器中查看到audiodg.exe进程CPU占用率过高,导致系统运行缓慢甚至出现假死现象,出现这种问题该如何解决呢   Win7...
    99+
    2023-06-13
    Win7 32位 audiodg进程CPU占用率过高 问题 CPU 占用率 进程 解决
  • win7 cpu占用过高怎么办? windows7cpu占用过高解决方法汇总
    方法一     1、驱动没有经过认证,造成CPU资源占用过高   大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因。    2、防、杀毒软件造成故障   由于一些防、杀毒软加入了对网页、插件、邮...
    99+
    2023-06-08
    win7 cpu 占用 解决 方法
  • mysql占用cpu超过100%怎么办?mysql占用cpu特别高的解决方法!
    前段时间我的一个网站经常打不开,通过检查发现服务器cpu占用超过100%;通过top命令发现是mysql占用cpu特别高导致的,于是优化了mysql语句,mysql升级到了mysql8最新版本等,但是并没有什么卵用。过几天有出现这种情况。甚...
    99+
    2023-10-18
    mysql 数据库
  • 电脑cpu占用过高怎么办的解决方法
    当电脑长时间使用后,发现CPU占用率过高,应采取何种措施?。而这个时候,电脑的运行速度也会变得非常的慢,cpu也会非常的热,而cpu发热严重的时候会极大的缩短电脑的使用寿命,那么电脑cpu占用过高怎么办呢?接下来让小编为大家带来电脑cpu占...
    99+
    2023-07-16
  • Vmmem进程(WSL)占用CPU或内存资源过高的解决办法
    背景:         有没有一瞬间,在开启docker或打开虚拟机时,内存瞬间飚增,进行查看进程消耗是一个Vmmem的进程在作祟,那么Vmmem是什么呢,又如何进行限制呢! 什么是Vmmem:         Vmmem:是一个系统合成的...
    99+
    2023-09-16
    java 运维 开发语言
  • qt程序cpu占用过高如何解决
    如果QT程序的CPU占用过高,有以下几种可能的解决方法:1. 优化算法和代码:检查程序中可能存在的性能瓶颈和低效的代码,尝试优化它们...
    99+
    2023-09-16
    qt
  • wordpress 占用内存 CPU过高的解决方案
    (ChatGpt的回复再结合其它资料整理,有任何意见欢迎指出)WordPress占用内存过高可能由多种因素引起,以下是一些可能的原因和解决方法。总之,为了解决WordPress占用内存过高的问题,您需要对主题,插件,数据库,缓存,PHP版本...
    99+
    2023-09-03
    php 开发语言
  • sqlserver占用cpu过高如何解决
    SQL Server占用CPU过高可能由多种原因造成,以下是一些常见的解决方法: 优化查询语句:检查并优化频繁执行的查询语句,确...
    99+
    2024-05-10
    sqlserver
  • weblogic占用cpu过高如何解决
    WebLogic占用CPU过高可能是由于以下原因导致的:1. 应用程序负载过大:检查应用程序是否在处理大量请求或并发用户时导致CPU...
    99+
    2023-09-01
    weblogic
  • win10玩dnf时cpu占用过高解决方案
    在应用win10电脑操作系统时,有一部分DNF地下城玩家体现在游戏时cpu占用率过高,有时乃至占用率做到了100%,针对这样的事情我觉得有可能是互联网的问题,也是有可能是游戏中一些作用产生的BUG,操作步骤就一起来看看我是怎么做的吧~win...
    99+
    2023-07-19
  • Java进程内存占用过高,排查解决方法
    Java进程内存占用过高,排查解决方法 在Java应用程序开发过程中,我们经常会遇到Java进程占用内存过高的问题。这可能会导致系统性能下降、应用程序崩溃甚至无法启动。本文将介绍一些常见的排查和解决方...
    99+
    2023-10-20
    java 开发语言 Java
  • CPU资源占用过高问题解决
    内容摘要:CPU使用率高达100%。碰到这种情况,一般初学者都会选择重装系统来解决,然而其方法效果很好,但是它存在很多缺陷,如重装系统后,原来的系统设置必须重新设置,常用软件也得重新安装,非常麻烦。其实我们完全可以不重装...
    99+
    2023-05-23
    解决 问题 占用 资源 系统 软件 运行 程序
  • win7 explorer占用cpu过高怎么解决
    这篇文章主要讲解了“win7 explorer占用cpu过高怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7 explorer占用cpu过高怎么解决”吧!小编建议使用第三方杀毒...
    99+
    2023-07-02
  • java应用cpu占用过高问题分析及解决方法
    使用jstack分析java程序cpu占用率过高的问题1,使用jps查找出java进程的pid,如37072,使用top -p 14292 -H观察该进程中所有线程的CPU占用。[root@cp01-game-dudai-0100.cp01...
    99+
    2023-05-31
    java cpu ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作