jconsole.exe帮了我的大忙

来源:互联网 发布:mac系统重装u盘 2016 编辑:程序博客网 时间:2024/05/04 12:34

这些天我做的一个系统所在的tomcat总是无征兆的卡住,现象是客户端无法访问此tomcat下的任何工程,包括它自己的manager工程。服务器上的控制台也没有任何异常输出,过一段时间没准自己会好起来,由此推断应该是cpu或者内存满负荷运载了。经过了几天的log调试并未找到问题所在。

后来在网上学会了用jdk的bin目录下的jconsole.exe检测,每当tomcat卡住的时候我就打开jconsole.exe查看线程中的异常,发现每次卡住的时候jconsole很多线程都写着:

“状态:BLOCKED 在 org.apache.commons.dbcp.AbandonedObjectPool@f11de2 上,拥有者: http-8085-17”

我们再去看http-8085-17线程,里面写着:

"状态:BLOCKED 在 oracle.jdbc.driver.T4CConnection@1bcb5be 上,拥有者: http-8085-1"

然后我们在去看http-8085-1线程,里面有很多堆栈信息,从里面找到你熟悉的,比如我的是:

com.changhongit.wchuyun.pages.BasePageWith2FenYe.onSelectedFromQuery(BasePageWith2FenYe.java:259)
com.changhongit.wchuyun.pages.BasePageWith2FenYe.dispatchComponentEvent(BasePageWith2FenYe.java)
com.changhongit.wchuyun.pages.Chuku.dispatchComponentEvent(Chuku.java)

这样一来,一下就锁定到某一个页面了,我打开这个页面挨个情况去测试,发现当筛选条件状态为“异常签收”时执行查询操作就会卡住,貌似此时已经有一个线程被占住了,果然,过一段时间tomcat就卡住了,我推断这就是问题所在,好了。接下来我去优化这部分的sql,编译,测试,上传,搞定。运行了一下午了,再未出现卡住的现象。

结论是:当你遇到一个请求很久都跑不完的时候一定要注意了,因为这时,即使把客户端的网页关掉后台也会占用一个线程。久而久之就会出现tomcat卡住的现象