问题出现:当时把这个功能分支合并到测试分支后,过了几天都没什么事情,后面运行了几天,业务过来说测试环境登不上了,我以为是用户服务挂了,登上测试环境发现用户服务还是运行状态,我直接重启了一下,重启后能用了,我以为没什么事了,等系统运行半天又同样的问题出现了,这个时候我又重启了一下,又过了半天又出现登不进 出现死机现象,这个时候就开始排查问题
因为测试环境没有安装监控软件,所以第一想到开始怀疑可能是服务频繁FULLGc了,于是进docker 用户服务用下面命令查看JVM内存状况
打印堆内存状况如下:
结论:
看这些打印数据,排除FullGc的可能线,那就猜测可能是线程阻塞了
使用jstatck打印线程状态信息
最后慢慢排查到这个线程的转态
代码有问题的地方 线程一直处于等待获取redis连接
根据 OrganizationExtendServiceImpl.java:87 找到对应代码如下:
在这代码中由于获取redis连接后 ,设置缓存后未能在最后关闭redis连接 导致连接一直存在