一直知道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行。赶紧去看源码,发现这是一行开启事务

最低0.47元/天 解锁文章
1780

被折叠的 条评论
为什么被折叠?



