一个毕生难忘的BUG
记得以前接手过一个Java项目,服务器程序,直接让Jar在linux上跑的那种,
这个项目由两个web服务组成,也就是两条Java进程,主进程 xxx.jar,辅助进程 xxx_helper.jar。主进程程序中某些功能依赖于辅助进程提供的服务。
困扰我们的BUG是在生产环境中辅助进程xxx_helpler.jar不定时无故崩溃,且无jvm错误日志产生,也无被系统本身因为资源损耗严重问题而杀死的记录。 百思不得其解之下我们只能把问题归因于是程序存在性能问题而被杀死,至于为什么没有杀死记录没人知道。 当时团队中没有linux玩的很溜的人,也不会查记录,通过我们那点粗浅的经验,我们想当然的以为程序崩溃就是因为消耗内存过多被系统杀死的,因为当时跑这个程序的机器内存异常紧张,所有人的思路都往这个方向被带了过去。
我开始优化xxx_helper.jar程序的性能,什么缓存、多线程、jvm启动参数调优、降低代码算法事件复杂的,反正各种折腾,几乎把代码全部重写一遍, 可程序无辜崩溃问题依旧存在 。
为了这个问题我连着好多天吃不好睡不香,做梦都在想办法解决这个问题。 写代码多年,这个问题让我体验到前所未有的无力感。 然而,正当我无计可施之际, 转机来了。 我无意间打开了重启主进程xxx.jar的脚本,发现里面有这么一段
ps aux | grep xxx | awk '{print $2}' | xargs kill -9
这段脚本的作用是,提取进程名称中有xxx关键字的进程ID, 然后kill之。因为整个脚本的逻辑是先关闭存在的进程,然后再启动。
而我的项目主进程xxx.jar和辅助进程xxx_helper.jar名称中都存在xxx关键字, 也就是说之前xxx_helper.jar这个进程无辜崩溃并不是因为程序本身的原因,而是因为主进程启动脚本在杀死主进程xxx.jar时一道把xxx_helper.jar也给杀了。
看到这段脚本我整个人呆了,就因为一时疏忽,却浪费了好几天的时间, 这跟花了几千块钱买到价值几块钱的东西是一样的感受,而且我这还是自己坑自己,这种滋味别提有多难受了。 我当时就用38码的手狠狠的抽打自己40码的脸,以发泄内心悔恨自责的情绪。
后来,等冷静下来以后,我只能安慰自己花了这么多功夫也不是一无所获,至少程序的性能是被我实实在在优化了。 虽然, 这种优化对于这个项目是毫无意义的。
通过这个事故我领悟到,对于某些顽固的程序BUG,当我们根据自己想当然的经验难以找到形成原因时, 就应该跳出问题的本身或者自己寻找BUG的思维框架来思考, 因为造成BUG的原因往往和之前寻找BUG的路径八竿子打不着。
一个毕生难忘的BUG的更多相关文章
- 一个比较难忘的BUG
本学期开设了软件测试课程,在课上有讨论到bug,想到bug,真是很令人头疼的东西,相信每个程序都多多少少会有几个头疼的bug. 初学java时写过一个字符串判断的循环,之前学的C++字符类型用“==” ...
- 最难忘的Bug调试经历
摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...
- ASP.NET MVC的Ajax.ActionLink 的HttpMethod="Get" 一个重复请求的BUG
这段时间使用BootStrap+Asp.net Mvc5开发项目,Ajax.ActionLink遇到一个重复提交的BUG,代码如下: @model IList<WFModel.WF_Temp&g ...
- 最近提交一个mysql5.7的bug,提醒自己以后注意写SQL要规范
最近帮朋友提交一个mysql5.7的bug , oracle mysql 的大神还回复我 , 以后注意书写sql规范 , 潜台词是不是不要给他们增加工作量 https://bugs.mysql.com ...
- 移动端一个奇怪的触摸bug
这两天遇到一个很奇怪的bug,在移动端,一个页面里所有的input框都不能点击,我查了一下,里面的没有设置readonly属性,只要页面滚动一下就可以用了,而且,只要我在真机测试的时候,f12开发者模 ...
- STL 库中的陷阱----一个难以察觉的 bug
请找出下面程序的 bug? int maxProfit2(vector<int> &prices) { int local[3] = {0}; int global[3] = {0 ...
- 一个因为粗心的Bug
/** * 数据绑定,分页显示 */ private void updataMenu(final EditText search) { if(listwz==null) { return; } pag ...
- 表与表的关系把RD搞乱了,记一个Procedure中的bug
就是6张表的关联查询,写了一个存储过程,使用4层for来处理 bug:最后一个for中,两张表的关联条件少了一个,结果数据多查了. 排查办法:使用dbms_output.printline('');每 ...
- 记一个CRenderTarget中的BUG及解决办法
转载请注明出处:http://www.cnblogs.com/Ray1024 一.问题描述 在MFC中使用Direct2D有现成的方法,在Visual Studio 2010 SP1及以上环境中MFC ...
随机推荐
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 【BZOJ1412】狼和羊的故事(网络流)
[BZOJ1412]狼和羊的故事(网络流) 题面 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...
- 【洛谷2015】【CJOJ1976】二叉苹果树
题面 Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1.我们用一根树枝两端连 ...
- BZOJ4321: queue2
题面 传送门 Sol 先设一个套路的状态:\(f[i][j]\)表示到第\(i\)个人,有\(j\)对冲突 但是我们不能确定\(i-1\),所以不好决策i的位置 所以再加一维\(0/1\),\(f[0 ...
- Cocos2d-x 集成openinstall(Android)
目的: 1. Cocos2d-x集成openinstall sdk? 有这么一个场景,甲给乙分享了链接,乙使用并下载APP,推荐者甲和乙的关系这个思路是怎样的? 你首先想到的也许会说,那当然就是给对方 ...
- Git常用命令手册
github 的使用教程(非常详细的小白视频)链接如下: http://yun.itheima.com/course/209.html Git 详细使用手册链接如下: https://git-scm. ...
- eclipse的常用快捷键和一些基本设置!!!
对于一些比较繁琐简单的代码没必要天天敲,为了提高效率,还是需要使用一些快捷键的:下面就说了一些比较基本的. alt+shift+s+c 无参构造器 alt+shift+s+O 有参构造器 ...
- 纯代码实现WordPress评论回复自动添加@评论者的功能
先看看效果: 这个有什么用呢?添加了@功能之后那些用户评论之间的层次关系就很清晰了,我们可以清楚地知道这些评论是谁发给谁的. 其实主要是为了提升逼格. 实现方法: 将下面代码加入function.ph ...
- 直接删除undo及temp表空间文件后的数据库恢复一例
前几天,某用户研发找到我,说他们的研发库坏了,问我能恢复不?我问他们做了什么操作,一个小男孩儿说,看到空间满了,清除了点儿数据,我说是不是连数据库的文件也清除了,他说没有,他清除的是ORACLE_HO ...
- 关于synchronized与volatile的小析
简单点说:synchronized很强大,既可以保证原子性,也可以保证可见性,而volatile不能保证原子性: 可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到. 共享变量:如果一个变量 ...