祖传代码对我的折磨还没有完。啥啥不让装,profiler之类的想都别想,只有用最原始的命令行来解决。
有一天,客户把我们这边的大领导怼得不行了,这边的领导让我帮着看一下这个技术问题。
现象:
就是有时候会再现用户登录的时候,非常的“慢”,当然这个慢是用户描述的,感觉像卡着了。
第一步分析:
这是个测试环境,资源分配的是比较少,但是不应该撑不住,但是本着严谨一点的态度,还是先排除了出问题的时候,CPU并不高 top -Hp,并且业务线程和GC的CPU也使用不高。
第二步 看看thread stack呗
我没有机器的权限是同事帮忙执行的执行jstack。。。。提示命令不存在。。。这个时候我问了一下才知道是JDK是jrocket 1.6
这个时候我从后台日志看到都是数据库链接是closed掉 的,我说先解这个问题吧,
可是客户那边权限控制得很严,怎么办呢
只有dump内存中我找到了一点数据库连接池的线索,DBCP的,我说这个好像没有配置连接池的检查吧。 给加上去了
可是又继续发现生产上没有,原来生产是用weblogic,测试环境用的是TOMCAT
好嘛,先解决这个链接被closed掉。
第三步, 第二天一跑,没有链接被closed掉了。
但是客户又吐槽卡住了,我看了一下jrocket(我也没用过这玩意),看到有jrcmd命令,这不就是jcmd么,于是通过jcmd 下载到了线程log
于是分析了一拨,发现
看了一下源码,这玩意都在synchronized等待呢,
先查查这把锁是谁占了吧
占锁的地方在
首先evictor根本不应该占有锁嘛,我找了高一点的1.4版本看了一下(当然这个也很老了2010年的)已经去掉了这把锁。
于是上了新的版本。 但是这里本质上还有个问题,就算去掉了这个,但是上面这个还是oracle关闭链接的时候卡住了,这个问题才是本因,触发了别人多持有大范围的锁的BUG而已.
只有先上上去了,看看能不能解决掉,但是本质上感觉链接也不多,但是生产和测试环境之间的似乎不太稳定,得排查网络和oracle的服务了。