评论

收藏

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

编程语言 编程语言 发布于:2021-10-07 16:17 | 阅读数:277 | 评论:0

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。下面这篇文章主要给大家介绍了一次因Java应用造成CPU过高的排查实践过程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
前言
最近遇到一个java应用造成了服务器cpu使用率过高,最后查询,问题是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放,死循环造成了cpu使用率过高的现象,详细原因就不做详细分析了,主要分享一下问题排查的过程。
使用top命令查询服务cpu使用情况
DSC0000.jpg

服务器资源使用率
可以看到31737这个进程的cpu使用率巨大
使用top -hp 31737查询31737进程中各个线程的资源使用率
top -hp 31737
使用top -hp 31737查询31737进程中各个线程的资源使用率
DSC0001.jpg
31737进程中各个线程的使用率

由于当时的截图丢失了,简单说一下,使用top -hp 31737命令查询到31737进程中,一个线程id为5322占用cpu过高
使用printf "%x\n" 5322把线程id转化为十六进制
printf "%x\n" 5322
因为打印线程栈的时候,本地线程标识nid是用十六进制表示的,使用该命令把线程id转化为十六进制
DSC0002.png
5322的十六进制为14ca

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

31737的堆栈信息
如图,线程的状态为timed_waiting,对象等待中,查看源码
DSC0004.jpg

出现问题的代码
发现问题的原因就不做详细分析了,这里主要是分享一下问题排查的过程
度娘一下有个大神回答的不错,连接在这里,有兴趣的可以自己去看一下https://stackoverflow.com/questions/6981564/why-must-the-jdbc-driver-be-put-in-tomcat-home-lib-folder/7198049#7198049
DSC0005.jpg

大神的回答
大致原因就是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对CodeAE代码之家的支持。
原文链接:https://www.jianshu.com/p/127685d40dba

关注下面的标签,发现更多相似文章