目录

问题现场

测试环境tomcat进程占用CPU一直持续99%,但是通过jstack查看log,也没有任何线程死锁的情况。

此时通过$catalina_home/bin/shutdown.sh脚本无法正常停止tomcat。

这是什么原因?

线程死锁 vs 线程死循环

验证线程死锁不会导致CPU持续高负载

// 验证线程死锁是否会导致CPU占用率一直居高不下
public class LockTest {
private Object alock = new Object(); // a锁
private Object block = new Object(); // b锁 public static void main(String[] args) {
new LockTest().start();
} private void start() {
new Thread(new ThreadA()).start();
new Thread(new ThreadB()).start();
} private void sleepOfSeconds(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} // 在线程A中先获取a锁,再获取b锁
class ThreadA implements Runnable {
private String name = "ThreadA";
@Override
public void run() {
synchronized (alock) {
System.out.println(name + " get alock");
sleepOfSeconds(50);
}
System.out.println(name + " release alock");
System.out.println(name + " waiting block");
synchronized (block) {
System.out.println(name + " get block");
}
System.out.println(name + " release block");
}
} // 在线程B中先获取b锁,再获取a锁
class ThreadB implements Runnable {
private String name = "ThreadB";
@Override
public void run() {
synchronized (block) {
System.out.println(name + " get block");
sleepOfSeconds(10);
}
System.out.println(name + " release block");
System.out.println(name + " waiting alock");
synchronized (alock) {
System.out.println(name + " get alock");
}
System.out.println(name + " release alock");
}
}
}

线程进入死锁状态时,不会导致CPU持续高负载,实际上当线程进入死锁之后是等待获取对象所被执行,此时CPU是空闲的。

导致CPU负载持续高的原因是线程进入了死循环,导致CPU持续在工作,此时线程的状态应该是Runnable,而不是Blocked。

排查Java进程导致CPU持续高的方法

整体思路:

1.先找到占用CPU比较高的进程ID

2.再找出该进程下CPU占用比较高的线程ID,并输出该线程ID的十六进制值

3.使用jstack命令查看并过滤出第2步中得到的线程ID对应堆栈信息,从而确定CPU占用高的地方在哪里

在Linux环境下,通过如下步骤可以实现对Java进程CPU持续高负载的问题排查:

  1. 通过jps命令找到Java进程ID,并使用top命令确定CPU占用高的进程是否为jps命令找到的Java进程。
  2. 通过ps -mp pid -o THREAD,tid,time命令查看进程的线程列表,找到CPU占用最高的线程ID,并使用printf "%x\n" tid命令输出线程ID的16进制格式:tid_hex 。
  3. 通过jstack pid |grep tid_hex -A 30查看线程堆栈信息,找到处于Runnable状态的线程中执行的代码片段,就可以分析出对应导致线程死循环的原因了。

可以将上述命令整理成一个脚本工具,用于临时排查CPU高的问题,详见:https://raw.githubusercontent.com/nuccch/iToolBox/master/shell/show_java_process_thread_stack.sh

Tomcat的CPU占用高的原因总结

  1. 线程死锁和线程死循环不是一个概念,千万不要弄错。
  2. 通常来讲,对于部署到Tomcat中的应用程序,排除程序代码进入死循环的原因之外,会导致Tomcat进程CPU持续高负载的可能因素是存在大量的TCP连接请求(并发很大)。
  3. 由于应用程序出现堆内存空间不够用导致频繁GC,也会导致CPU使用率高。
  4. 如果应用日志输出非常频繁,也会导致CPU使用率持续高。

【参考】

https://www.jianshu.com/p/3160ba8e150d 记一次tomcat cpu占用率过高的问题排查

http://www.blogjava.net/hankchen/archive/2012/05/09/377735.html 线上应用故障排查之一:高CPU占用

谈谈Tomcat占用cpu高的问题的更多相关文章

  1. 查看JAVA占用CPU高的线程日志

    # . 查看主进程占用cpu高 top # java # . 按照线程占用cpu由高到低进行排查: -o THREAD,tid, # USER %CPU PRI SCNT WCHAN USER SYS ...

  2. tomcat占用cpu过高解决办法

    在工作中经常遇到tomcat占用cpu居高不下,针对这种情况有以下处理办法进行排查. jps --> 查看java的进程 top -Hp pid --> 根据jps得到的进程号(pid), ...

  3. 查看tomcat项目中,具体占用cpu高的线程。

    1.查看主进程占用cpu高: 此处主进程:27823 ~]# top top - :0: up days, :, 3 users, load average: 13.12, 13.31, 13.23 ...

  4. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法,有人在暴力破解

    关于csrss.exe和winlogon.exe进程多.占用CPU高的解决办法 最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要好半天才反映过来,看到任务管理器有多个 ...

  5. TortoiseSVN status cache占用CPU高

    进程占用CPU高 每次从SVN上更新资源时,电脑都会卡死,直到资源更新完.当要Commit资源时,SVN也会卡死资源管理器,如下图所示: 解决占用CPU高的问题 1.禁用图标缓存 2.排除路径和包含路 ...

  6. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法

    原地址 http://blog.sina.com.cn/s/blog_912e77480101nuif.html   最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要 ...

  7. linux c++应用程序内存高或者占用CPU高的解决方案_20161213

    对于绝大多数实时程序来说,实时处理相关程序中的循环问题所带来的对机器的损耗和自身的处理速度的平衡,以及与其他程序的交互以及对其他功能的影响难免会成为程序设计中最大的障碍同时也是最大的突破点. 在所有这 ...

  8. 利用jstack命令定位占用cpu高的java线程及具体错误代码信息

    1.先用top查询某进程的线程CPU占用情况,定位到cpu占用高的进程pid 2.根据pid定位具体的线程top -p PID -H ,找出占用cpu最大的pid,此处占用cpu比较平均,我们随便选择 ...

  9. 记一次mogodb占用cpu高问题

    公司服务器上安装了contly,是一个开源的node.js项目,用于统计手机app使用情况,后端数据储存使用的mongodb,使用的时候经常发现mongodb占用cpu非常高,打到了210%的爆表值 ...

  10. tomcat占用cpu比较多

    在Linux中当Tomcat启动后,我们只是去查看应用是否能够正常访问来判断Tomcat启动是否正常.一般情况下这样看是没有问题的,但是有时候我们会发现当Tomcat使用了一段时间后,开始出现CPU或 ...

随机推荐

  1. 关于IO性能的一些学习与了解

    关于IO性能的一些学习与了解 摘要 最近心气不高. 学习进度也拖的比较慢. 以后想能够多为自己着想.自己有自己的节奏, 不能只为别人考虑. 要改变一下自己的做事风格. 一些事情想帮则帮, 不想帮就当看 ...

  2. [转帖]jar启动指定JDK/JRE 安装路径教程

    https://blog.csdn.net/weixin_40986713/article/details/128136777 前言 因为疫情在家办公的缘故,有个老项目,需要改个接口,然后需要前端联调 ...

  3. [转帖] Linux文本命令技巧(上)

    Linux文本命令技巧(上)   原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 前一篇我介绍了awk,这是一个全能的文本处理神器,因为它本身就是一门编程语言了 ...

  4. Linux无头模式使用mat分析dump的方法

    摘要 mat可以很好的进行jvm的内存dump的分析. 但是大部分服务器是没有GUI界面的. 而且就算是有GUI界面也很难直接使用. 但是随着jvm堆区越来越大. WindowsPC机器已经很难进行分 ...

  5. JDK内嵌指令的简单学习

    java 可以使用 java -jar的方式启动服务 日常工作中用到的比较少 javac 可以将.java 文件编译成 .class中间代码 这个工具开发编写代码中是经常需要使用的, jenkins ...

  6. linux中如何统计千万个文件总和

    很简单.很简单.很简单.重要事情说三遍 命令:ls | grep '匹配信息' | wc -l ls查看该目录下的所有文件,果然隐藏文件也要匹配上的话,需要:ls -a grep匹配,如查看文件中有. ...

  7. 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略.添加基线(baseline).优势函数.动作分配合适的分数(credit) 1.核心词汇 策略(policy):在每一个演员中会有对应的 ...

  8. 2.2 CE修改器:未知数值扫描

    本关需要扫描未知数只扫描,要在不知道初始值的情况下找到一个在0到500之间的数值.首先,选择"未知的初始值"扫描方式,在数值类型中选择 4 字节,并点击"首次扫描&quo ...

  9. Load-balanced-online-OJ-system 负载均衡的OJ系统项目

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 本项目Github地址 - ...

  10. System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】

    前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014. ...