最近又遇到一个奇怪的事情,一个非常简单的程序,就是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程序卡住问题的解决相关推荐

  1. java程序卡住的原因_Java程序卡住问题的解决

    最近又遇到一个奇怪的事情,一个非常简单的程序,就是web调用一下从数据库读取一批数据出来显示,程序刚开始一点问题没有,过一段时间就突然死掉了,所有的查询都没有反应. 探索+折磨: 刚开始用的办法真的叫 ...

  2. java提示程序包不存在,解决:Error:java xxxx 程序包不存在

    java程序包不存在,解决:Error:java xxxx 程序包不存在 今天早上,一跑项目报错了.. java程序包不存在.我是小白啊,之前没有遇到过这种问题就赶紧查了查.终于解决了. 其实我遇到的 ...

  3. 为何优秀的Java程序员如此难招?

    原创 2016-07-06 100offer http://mp.weixin.qq.com/s?__biz=MzA5NzkxMzkwNQ==&mid=2649516938&idx=1 ...

  4. 为何优秀的Java程序员如此吃香?

    最近一个月,我们从客户经理那里听到不少关于「Java程序员供不应求」的消息.今年6月,在北京已签约的103家企业中,对Java程序员的需求总量就高达334名,平均每家企业至少需要3名以上Java程序员 ...

  5. 应用程序已被java 1.6_Apple Java更新1.6.0_51之后,Swing应用程序卡住了

    我们有一个Java Swing客户端应用程序.它作为Java Web Start小程序和install4j安装程序安装. 自从Apple发布了最新的Java 6升级以来,在Installer和Web ...

  6. java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决

    我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...

  7. Java黑皮书课后题第4章:*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题。读取的输入值是一个字符串,比如“11.56“

    *4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题.读取的输入值是一个字符串,比如"11.56" 题目 题目概述 ...

  8. Java黑皮书课后题第2章:*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值

    *2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题.以整数值作为输入,其最后两位代表的是美分币值 题目 题目概述 举例 程序清单2-10 修改思路 ...

  9. java系统反应慢怎么解决_为什么反应慢的Java程序员更容易成功

    小的时候总是觉得成功人士应该是口若悬河,滔滔不绝的,可是,长大后,看电视的时候总是发现,做领导的讲话总是很慢,尤其是看新闻联播的时候,等下一句话等的好着急.为什么会出现这种情况呢?作为Java程序员也 ...

  10. win8.1已阻止java_win8系统下打开java程序时出现应用程序已被安全设置阻止的解决方法...

    今天和大家分享一下win7系统下打开java程序时出现应用程序已被安全设置阻止问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统下打开java程序时出现应用程序已被安全设置阻止 ...

最新文章

  1. 麦肯锡:优秀数据科学家的5个特征!
  2. c语言 简单编程题,c语言简单编程练习题.doc
  3. 挣脱浏览器的束缚(7) - CrossSubDomainExecutor
  4. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
  5. java中的23种设计模式_Java开发中的23种设计模式详解
  6. LeetCode 405. 数字转换为十六进制数
  7. 9个细节告诉你,达摩院过去一年做了啥
  8. Ignite Compute helloworld-分布式计算
  9. 旧闻新看 ---- 西门子为什么要收购TESIS PLMWare
  10. 安卓开发使用ttf文字_Android中正确使用字体图标(iconfont)的方法
  11. 【BZOJ2049】【codevs1839】洞穴探测,LCT练习
  12. OpenShift 4 - DevSecOps Workshop (10) - 向Stage环境部署应用镜像
  13. 【OpenGL】OpenGL安装glew扩展库
  14. pythonjson构建二维数组_在Python中从JSON构建表
  15. Linux学习之路(2-1)文件、目录与磁盘格式
  16. button3 电脑上mouse,自定义鼠标按键(X-Mouse Button Control)
  17. Fiddler抓取手机端APP接口数据
  18. Win7安装CENTOS
  19. feedburner怎么用_在FeedSky和FeedBurner中无缝切换
  20. python tkinter progressbar_Tkinter 之ProgressBar进度条标签

热门文章

  1. 自定义Android中Dialog的弹出动画
  2. 函数对象、对象、原型
  3. python模块之re模块
  4. SVN的学习和使用(七)——SVN提交操作
  5. 剑指offer 35 第一个只出现一次的字符
  6. mysql 拼音首字母排序
  7. MySql安全模式下修改root账号密码
  8. 学习 Python 第八天
  9. CN域名调查报告称青少年成个人CN域名主要注册群
  10. 推荐下载:Windows 7 Ultimate (x86/x64) MSDN简体中文旗舰版