java活动线程过高,一次因Java应用造成CPU过高的排查实践过程

前言

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

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

f597dd795968b252f2dae558017acaa2.png

服务器资源使用率

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

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

top -Hp 31737

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

3960373d9db998f058c277278027d919.png

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

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

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

printf "%x\n" 5322

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

a91e047771168b84a2813d1a959bf31c.png

5322的十六进制为14ca

使用jstack命令打印堆栈信息

jstack 31737 | grep -10 14ca

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

4454f6df113cd58dad1aa3c178cce2c6.png

31737的堆栈信息

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

f7cd9f76363589239c5917ae2eec231b.png

出现问题的代码

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

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

38b489b5e4641006272495407e3b574e.png

大神的回答

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值