前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >谈谈Tomcat占用cpu高的问题

谈谈Tomcat占用cpu高的问题

作者头像
编程随笔
发布于 2020-03-24 09:25:15
发布于 2020-03-24 09:25:15
3.2K00
代码可运行
举报
文章被收录于专栏:后端开发随笔后端开发随笔
运行总次数:0
代码可运行

问题现场

测试环境tomcat进程占用CPU一直持续99%,但是通过jstack查看log,也没有任何线程死锁的情况。 此时通过$catalina_home/bin/shutdown.sh脚本无法正常停止tomcat。

这是什么原因?

线程死锁 vs 线程死循环

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 验证线程死锁是否会导致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持续高的方法

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占用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
IDEA 连接数据库
然后输入用户名和密码(密码是隐藏的),然后点击 Test Connection :
wsuo
2020/07/30
4.2K0
IDEA 连接数据库
MySQL:设置时区
在开发过程中,设置 IDEA 连接数据mysql数据库连接时遇到异常“Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.” 。意思是时区设置的不对。 于是寻找解决方法。
张云飞Vir
2021/06/11
11.7K0
MySQL:设置时区
idea关联mysql时报时区错误
Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
cherishspring
2019/12/02
1.7K0
idea关联mysql时报时区错误
idea连接mysql数据库遇到Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ 。。。。。
第一步:检查MySQL时区是否正确 进入命令窗口(Win + R),连接数据库 mysql -uroot -p,回车,输入密码,回车,如图:
百思不得小赵
2022/12/01
5930
idea连接mysql数据库遇到Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ 。。。。。
Mysql 8.0+ 的安装以及密码修改步骤
打开刚刚解压的文件夹 C:\web\mysql-8.0.11 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息:
乱码三千
2021/07/29
6940
Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually
错误如下: Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually Android转Java,第一个坑,记录一下,以后就能不再碰到这个问题,出现这个问题的原因有两个: 1.你的MySQL没有设置时区 2.你的MySQL驱动没有同步 先来检查第一个问题,步骤如下:
晨曦_LLW
2020/09/25
1.1K0
首页SQLIDEA中操作MySQL问题
Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property 原因:服务器返回无效时区,转到“高级”选项卡并手动设置“serverTimezone”属性。
cherishspring
2019/10/24
9570
首页SQLIDEA中操作MySQL问题
day59-Django基础-form提交参数+新建APP+配置数据库
1.HTML文件的form表单的提交三要素: a. action将决定form提交的路径,给后台判断,method 方法 POST 给后台 b. name 将定义提交字典的 key 值 c. submit 按钮将提交这个表单里面的数据 image.png 2.使用频率极高的三个Django封装的方法 a. render 方法用来返回一个 HTML 的网页 b. HttpResponse 方法用来返回一个文本的字符串 c. redirect 方法用来跳转一个新的网页 image.png 3.后台如何获取前台传
少年包青菜
2019/09/18
5390
数据库时间慢了14个小时,Mybatis说,这个锅我不背~
同事反馈一个问题:Mybatis插入数据库的时间是昨天的,是不是因为生成Mybatis逆向工程生成的代码有问题?
程序新视界
2021/12/07
2.7K1
数据库时间慢了14个小时,Mybatis说,这个锅我不背~
【Mysql】Working with time zones, timestamps and datetimes in Laravel and MySQL
Working with time zones, timestamps and datetimes in Laravel and MySQL - Advanced and Qualified electronic signature marketplace (eideasy.com)
阿东
2023/10/22
7820
【Mysql】Working with time zones, timestamps and datetimes in Laravel and MySQL
一键帮你生成所需代码--EasyCode试试这个工具吧
EasyCode[1] 是基于 IntelliJ IDEA Ultimate 版开发的一个代码生成插件,主要通过自定义模板(基于 velocity)来生成各种你想要的代码。通常用于生成 Entity、Dao、Service、Controller。如果你动手能力强还可以用于生成 HTML、JS、PHP 等代码。理论上来说只要是与数据有关的代码都是可以生成的。
用户2781897
2020/08/25
1.4K0
一键帮你生成所需代码--EasyCode试试这个工具吧
在IDEA中如何一键生成代码,提高开发效率
文章目录 一、准备工作 1. 插件安装 2. 创建一个springboot项目 3. 准备数据库表 4. 在IDEA配置连接数据库 二、生成代码 1. IDEA中开始生成代码 2. 导入需要的依赖 3. 编写数据源的相关配置 4. 在dao接口添加@Mapper注解 三、测试 一、准备工作 1. 插件安装 在IDEA中安装(EasyCode)插件、(Lombok)插件。 2. 创建一个springboot项目 创建完成后的目录结构: 3. 准备数据库表 表结构: CREATE TABLE `user`
Twcat_tree
2022/11/30
1.3K0
在IDEA中如何一键生成代码,提高开发效率
mysql时区问题的一点理解--写入数据库的时间总是晚13小时问题
去年写了一篇“【曹工杂谈】Mysql客户端上,时间为啥和本地差了整整13个小时,就离谱 ”,结果最近还真就用上了。
低级知识传播者
2022/03/28
2.5K0
mysql时区问题的一点理解--写入数据库的时间总是晚13小时问题
数据库时区那些事儿 - MySQL的时区处理
当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Image的时区都是UTC。本文探究了MySQL及其JDBC驱动对于时区的处理方式,并尝试给出最佳实践。
颇忒脱
2018/10/19
4.7K0
IDEA 连接mysql时报错:Server returns invalid timezone.
IDEA 连接mysql时报错:Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ prope
兮动人
2021/06/11
6470
IDEA 连接mysql时报错:Server returns invalid timezone.
点餐系统部署文档(2020最新版),java后台部署和微信点餐小程序的部署
我们这里要安装的是mysql8.0数据库。只要是8.0开头的,不管是8.0.11还是8.0.19都可以。 数据库的安装,我在点餐视频的第3章的2,3,4节里都有讲。
编程小石头
2020/10/22
4K6
点餐系统部署文档(2020最新版),java后台部署和微信点餐小程序的部署
MySQL数据库时区设置
MySQL [(none)]> show variables like "%time_zone%";   #查看当前时区
Power
2025/03/01
7230
boot连接不上mysql数据库_关于springboot 连接mysql 数据库报错问题
The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
全栈程序员站长
2022/09/12
5.8K0
boot连接不上mysql数据库_关于springboot 连接mysql 数据库报错问题
时区信息记录表|全方位认识 mysql 系统库
在上一期《优化器成本记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql 系统库中的优化器成本记录表,本期我们将为大家带来系列第六篇《时区信息记录表|全方位认识 mysql 系统库》,下面请跟随我们一起开始 mysql 系统库的系统学习之旅吧!
老叶茶馆
2020/12/15
1.7K0
一文解决MySQL时区相关问题
在使用 MySQL 的过程中,你可能会遇到时区相关问题,比如说时间显示错误、时区不是东八区、程序取得的时间和数据库存储的时间不一致等等问题。其实,这些问题都与数据库时区设置有关,本篇文章将从数据库参数入手,逐步介绍时区相关内容。
MySQL技术
2020/07/06
7.5K0
推荐阅读
相关推荐
IDEA 连接数据库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档