目录

问题现场

测试环境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. [转帖]Java 认证与授权(JAAS)介绍

    https://www.cnblogs.com/wuyongyin/p/16981469.html JAAS(Java Authentication Authorization Service),即 ...

  2. CPU算力提升与实际性能提升的关系

    关于SPEC2006CPU和RedisBenchmark的理解 最近研究过硬件CPU的性能和Redis这样单线程重IO服务 突然想对比一下CPU算力提升占Redis性能提升的比率情况 性能很大程度由C ...

  3. CoreMark简单学习

    CoreMark简单学习 下载 https://github.com/eembc/coremark-pro 需要注意, 其实coremark是有两组. 一组是coremark 一组是 coremark ...

  4. [转帖]50年来Intel CPU变化有多大?频率从0.75MHz提升到5.2GHz

    https://m.baidu.com/bh/m/detail/ar_9297450181050583423?data_from=lemon 今天(11月15日)是Intel推出4004处理器50周年 ...

  5. [转帖] shell管道咋堵住了

    https://www.cnblogs.com/codelogs/p/16060378.html 背景# 起因是这样的,我们想开发一个小脚本,当cpu使用率过高时,使用jstack将java的线程栈保 ...

  6. CoreDNS的配置文件修改

    CoreDNS的配置文件修改 今天浪费了4个小时来调整coredns 这里简单记录一下 注意修改点: 1 kubernetes cluster.local. 需要增加集群内的配置 2 forward ...

  7. 深入学习C#系列文章01---C#3 革新写代码的新方式

    C#3 几乎所有的新特性都是为LINQ服务的,但他们单独使用也非常有用,接下来我们来简单看看C#3 的几个新特性吧. 一.自动实现的属性-----编写由字段直接支持的简单属性,不再显得臃肿不堪. 之前 ...

  8. P7031 [NWRRC2016] Anniversary Cake

    题目简述 有一块 \(n \times m\) 的长方形蛋糕.蛋糕上有两个蜡烛,分别用 \((x_1,y_1)\) 和 \((x_2,y_2)\) 表示.现在有一把刀要把蛋糕切成两半,请问切入的终点和 ...

  9. 从python3到python2的踩坑

    为什么要从py3到py2 背景:之前自学写过一些py3,而且我写的工具是基于python3来写的,但是公司项目是使用python2版本,希望已有工具或者新写的工具能同时在py2和py3上执行,所以记录 ...

  10. go中x/sync/semaphore解读

    semaphore semaphore的作用 如何使用 分析下原理 Acquire TryAcquire Release 总结 参考 semaphore semaphore的作用 信号量是在并发编程中 ...