一次因Java应用造成CPU过高的排查实践过程

 更新时间:2018年11月05日 15:07:10   作者:小草莓子桑  
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。下面这篇文章主要给大家介绍了一次因Java应用造成CPU过高的排查实践过程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

最近遇到一个java应用造成了服务器CPU使用率过高,最后查询,问题是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放,死循环造成了cpu使用率过高的现象,详细原因就不做详细分析了,主要分享一下问题排查的过程。

使用top命令查询服务cpu使用情况

服务器资源使用率

可以看到31737这个进程的CPU使用率巨大

使用top -Hp 31737查询31737进程中各个线程的资源使用率

top -Hp 31737

使用top -Hp 31737查询31737进程中各个线程的资源使用率


31737进程中各个线程的使用率

由于当时的截图丢失了,简单说一下,使用top -Hp 31737命令查询到31737进程中,一个线程id为5322占用CPU过高

使用printf "%x\n" 5322把线程id转化为十六进制

printf "%x\n" 5322

因为打印线程栈的时候,本地线程标识nid是用十六进制表示的,使用该命令把线程id转化为十六进制


5322的十六进制为14ca

使用jstack命令打印堆栈信息

jstack 31737 | grep -10 14ca

使用jstack 31737 | grep -10 14ca打印31737的堆栈信息,并查找本地线程标识为14ca的线程堆栈信息

31737的堆栈信息

如图,线程的状态为TIMED_WAITING,对象等待中,查看源码

出现问题的代码

发现问题的原因就不做详细分析了,这里主要是分享一下问题排查的过程

度娘一下有个大神回答的不错,连接在这里,有兴趣的可以自己去看一下https://stackoverflow.com/questions/6981564/why-must-the-jdbc-driver-be-put-in-tomcat-home-lib-folder/7198049#7198049

大神的回答

大致原因就是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Springboot集成Elasticsearch的步骤与相关功能

    Springboot集成Elasticsearch的步骤与相关功能

    ElasticSearch是开源搜索平台领域的一个新成员, ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎,这篇文章主要给大家介绍了关于Springboot集成Elasticsearch的相关资料,需要的朋友可以参考下
    2021-12-12
  • spring boot 配置freemarker及如何使用freemarker渲染页面

    spring boot 配置freemarker及如何使用freemarker渲染页面

    springboot中自带的页面渲染工具为thymeleaf 还有freemarker这两种模板引擎,本文重点给大家介绍spring boot 配置freemarker及如何使用freemarker渲染页面,感兴趣的朋友一起看看吧
    2023-10-10
  • Maven的安装+配置本地仓库路径方式

    Maven的安装+配置本地仓库路径方式

    这篇文章主要介绍了Maven的安装+配置本地仓库路径方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Spring Boot 项目启动失败的解决方案

    Spring Boot 项目启动失败的解决方案

    这篇文章主要介绍了Spring Boot 项目启动失败的解决方案,帮助大家更好的理解和学习使用Spring Boot,感兴趣的朋友可以了解下
    2021-03-03
  • java中jdk代理和cglib代理使用步骤详解

    java中jdk代理和cglib代理使用步骤详解

    这篇文章主要给大家介绍了关于java中jdk代理和cglib代理使用步骤的相关资料,JDK代理和CGLIB是Java中两种常见的代理实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Java基础教程之Map遍历的5种方式

    Java基础教程之Map遍历的5种方式

    Map作为Java中的一种集合,以键值对的形式存放一批数据,经常会被我们应用在项目中,这篇文章主要给大家介绍了关于Java基础教程之Map遍历的5种方式,需要的朋友可以参考下
    2024-01-01
  • 搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)

    搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)

    这篇文章主要为大家介绍了搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)的基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • idea使用带provide修饰依赖导致ClassNotFound

    idea使用带provide修饰依赖导致ClassNotFound

    程序打包到Linux上运行时,若Linux上也有这些依赖,为了在Linux上运行时避免依赖冲突,可以使用provide修饰,本文主要介绍了idea使用带provide修饰依赖导致ClassNotFound,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2024-01-01
  • Java负载均衡算法实现之轮询和加权轮询

    Java负载均衡算法实现之轮询和加权轮询

    网上找了不少负载均衡算法的资源,都不够全面,后来自己结合了网上的一些算法实现,下面这篇文章主要给大家介绍了关于Java负载均衡算法实现之轮询和加权轮询的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Springcloud中Feign传递参数的过程解析

    Springcloud中Feign传递参数的过程解析

    这篇文章主要介绍了Springcloud中Feign传递参数的过程,单个参数的传值有两种方式,第一种使用@RequestParam/@PathVariable进行传值,传递多个参数:多个参数的传值可以使用多个@RequestParam来进行传参,需要的朋友可以参考下
    2023-09-09

最新评论