记一次利用jstack排查错误的过程

一直知道jstakc这个命令,却没有怎么真正使用过,正好项目上碰到了一些问题,利用jstack辅助定位到了问题。下面对整个过程进行一个记录。

 

问题的表象是,系统的用户接收接口一直失败,调用的时候会很久都没有响应。经过很长时间的等待之后,会返回一个504网关超时,或者500错误。在用postman进行调用后,系统的日志里面会出现进入方法的一行日志,但好像没有向下流转,像是卡在了某个地方。向上翻看服务器日志,有一些关于redis的报错,是获取不到redis连接。尝试重启服务器,问题依旧,有几次日志内容还会出现“打开的文件过多”。

 

后面尝试使用jstack来调出jvm的栈内容,既然调用用户接收接口会卡在某个地方,那么肯定会有一段执行时间很长的代码。调出来看看具体是卡在了哪一行。

 

首先输入ps -ef | grep tomcat,拿到tomcat的进程号。然后输入jstack -l [pid],发现打印出了大量的内容,由于猜想问题出在用户接收接口,所以使用包名来对输出的内容进行一些过滤。

 

输入jstack -l [pid] | grep hidm.core

这一次输出的内容就少多了,观察到输出的内容中,有一行指向了AccountServiceImpl.java这个文件的173行。赶紧去看源码,发现这是一行开启事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值