Java程序卡住问题的解决
最近又遇到一个奇怪的事情,一个非常简单的程序,就是web调用一下从数据库读取一批数据出来显示,程序刚开始一点问题没有,过一段时间就突然死掉了,所有的查询都没有反应。
探索+折磨:
刚开始用的办法真的叫做非常原始。因为卡住连异常都不报,那很可能是什么没有设置超时。开始把web连接和数据库连接的超时设置检查并调整了一遍,但是问题依然没有解决。
接着看觉得又像是数据库取不到链接,这可能是数据库连接池耗尽,那么应该连接都没有释放。到mysql中查当前连接数,非常正常,感觉也不是连接的问题。当程序卡住的时候,其他和数据库连接的程序都很正常,自己的程序一重启也是正常的。所以应该也不是连接数耗尽的问题。期间也把程序的当前线程打印出来数了一下,线程数也没有异常膨胀。
把程序执行的每一句话前后都加上日志输出,惊讶的发现程序停在service调用dao的那个地方了。dao方法刚进去的第一句打印日志的话都不输出。难道是程序调用还能出错?!这个问题我现在也没想通,估计是spring从中搞的什么鬼。所以干脆就把dao层拆掉,代码都复制到service层来,结果代码卡在数据库查询那一句上了。
查看CPU和内存消耗都很低,但程序无故停住,这个现象和死锁也是一样的。但是程序中根本没用到锁,所以也可以排除。
想到自己是用dbcp的,上网一查说有bug的人很多,这就在想是不是考虑升级一下dbcp的版本,或者换成c3p0来试试。无奈中把数据库配置还弄错了,出问题的那个数据源反而没更换成c3p0,导致问题还是没解决。
醒悟:
SB的事情做的太多了,居然傻到数线程数,为什么不直接查看程序停在哪一句呢?!当程序再次卡住的时候,果断kill -3 [pid]把内存状态打印出来,结果一看就停在dbcp的getConnection方法上了。显然我是遇到了传说中的dbcp的bug,这次更换的时候又发现上次配置文件给写错了,悲剧啊。把dbcp升级到最新版本,运行了几天都没再现问题了。
kill命令只能在linux下面用,其实也可以用jdk自带的工具,比如用jstack去查看线程运行情况,这样在windows下面也可以使用。
总结:
Java是一个很开放的程序,对于出问题的情况利用提供的工具大部分都很容易定位。这中间一是你要知道有什么样的工具可以辅助你,至少你要把jdk/bin下面自带的工具看一遍;另外就是要有借助工具解决问题的意识,如果还是和刚开始学写代码的时候就知道到处打印输出的语句,那解决问题的层次实在是太低了,也很难把问题真正解决。
转载于:https://blog.51cto.com/passover/551554
Java程序卡住问题的解决相关推荐
- java程序卡住的原因_Java程序卡住问题的解决
最近又遇到一个奇怪的事情,一个非常简单的程序,就是web调用一下从数据库读取一批数据出来显示,程序刚开始一点问题没有,过一段时间就突然死掉了,所有的查询都没有反应. 探索+折磨: 刚开始用的办法真的叫 ...
- java提示程序包不存在,解决:Error:java xxxx 程序包不存在
java程序包不存在,解决:Error:java xxxx 程序包不存在 今天早上,一跑项目报错了.. java程序包不存在.我是小白啊,之前没有遇到过这种问题就赶紧查了查.终于解决了. 其实我遇到的 ...
- 为何优秀的Java程序员如此难招?
原创 2016-07-06 100offer http://mp.weixin.qq.com/s?__biz=MzA5NzkxMzkwNQ==&mid=2649516938&idx=1 ...
- 为何优秀的Java程序员如此吃香?
最近一个月,我们从客户经理那里听到不少关于「Java程序员供不应求」的消息.今年6月,在北京已签约的103家企业中,对Java程序员的需求总量就高达334名,平均每家企业至少需要3名以上Java程序员 ...
- 应用程序已被java 1.6_Apple Java更新1.6.0_51之后,Swing应用程序卡住了
我们有一个Java Swing客户端应用程序.它作为Java Web Start小程序和install4j安装程序安装. 自从Apple发布了最新的Java 6升级以来,在Installer和Web ...
- java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决
我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...
- Java黑皮书课后题第4章:*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题。读取的输入值是一个字符串,比如“11.56“
*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题.读取的输入值是一个字符串,比如"11.56" 题目 题目概述 ...
- Java黑皮书课后题第2章:*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值
*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题.以整数值作为输入,其最后两位代表的是美分币值 题目 题目概述 举例 程序清单2-10 修改思路 ...
- java系统反应慢怎么解决_为什么反应慢的Java程序员更容易成功
小的时候总是觉得成功人士应该是口若悬河,滔滔不绝的,可是,长大后,看电视的时候总是发现,做领导的讲话总是很慢,尤其是看新闻联播的时候,等下一句话等的好着急.为什么会出现这种情况呢?作为Java程序员也 ...
- win8.1已阻止java_win8系统下打开java程序时出现应用程序已被安全设置阻止的解决方法...
今天和大家分享一下win7系统下打开java程序时出现应用程序已被安全设置阻止问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统下打开java程序时出现应用程序已被安全设置阻止 ...
最新文章
- 麦肯锡:优秀数据科学家的5个特征!
- c语言 简单编程题,c语言简单编程练习题.doc
- 挣脱浏览器的束缚(7) - CrossSubDomainExecutor
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
- java中的23种设计模式_Java开发中的23种设计模式详解
- LeetCode 405. 数字转换为十六进制数
- 9个细节告诉你,达摩院过去一年做了啥
- Ignite Compute helloworld-分布式计算
- 旧闻新看 ---- 西门子为什么要收购TESIS PLMWare
- 安卓开发使用ttf文字_Android中正确使用字体图标(iconfont)的方法
- 【BZOJ2049】【codevs1839】洞穴探测,LCT练习
- OpenShift 4 - DevSecOps Workshop (10) - 向Stage环境部署应用镜像
- 【OpenGL】OpenGL安装glew扩展库
- pythonjson构建二维数组_在Python中从JSON构建表
- Linux学习之路(2-1)文件、目录与磁盘格式
- button3 电脑上mouse,自定义鼠标按键(X-Mouse Button Control)
- Fiddler抓取手机端APP接口数据
- Win7安装CENTOS
- feedburner怎么用_在FeedSky和FeedBurner中无缝切换
- python tkinter progressbar_Tkinter 之ProgressBar进度条标签