记得以前接手过一个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的更多相关文章

  1. 一个比较难忘的BUG

    本学期开设了软件测试课程,在课上有讨论到bug,想到bug,真是很令人头疼的东西,相信每个程序都多多少少会有几个头疼的bug. 初学java时写过一个字符串判断的循环,之前学的C++字符类型用“==” ...

  2. 最难忘的Bug调试经历

    摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...

  3. ASP.NET MVC的Ajax.ActionLink 的HttpMethod="Get" 一个重复请求的BUG

    这段时间使用BootStrap+Asp.net Mvc5开发项目,Ajax.ActionLink遇到一个重复提交的BUG,代码如下: @model IList<WFModel.WF_Temp&g ...

  4. 最近提交一个mysql5.7的bug,提醒自己以后注意写SQL要规范

    最近帮朋友提交一个mysql5.7的bug , oracle mysql 的大神还回复我 , 以后注意书写sql规范 , 潜台词是不是不要给他们增加工作量 https://bugs.mysql.com ...

  5. 移动端一个奇怪的触摸bug

    这两天遇到一个很奇怪的bug,在移动端,一个页面里所有的input框都不能点击,我查了一下,里面的没有设置readonly属性,只要页面滚动一下就可以用了,而且,只要我在真机测试的时候,f12开发者模 ...

  6. STL 库中的陷阱----一个难以察觉的 bug

    请找出下面程序的 bug? int maxProfit2(vector<int> &prices) { int local[3] = {0}; int global[3] = {0 ...

  7. 一个因为粗心的Bug

    /** * 数据绑定,分页显示 */ private void updataMenu(final EditText search) { if(listwz==null) { return; } pag ...

  8. 表与表的关系把RD搞乱了,记一个Procedure中的bug

    就是6张表的关联查询,写了一个存储过程,使用4层for来处理 bug:最后一个for中,两张表的关联条件少了一个,结果数据多查了. 排查办法:使用dbms_output.printline('');每 ...

  9. 记一个CRenderTarget中的BUG及解决办法

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.问题描述 在MFC中使用Direct2D有现成的方法,在Visual Studio 2010 SP1及以上环境中MFC ...

随机推荐

  1. [UOJ207]共价大爷游长沙

    UOJ sol 这题真是太神啦! 对于S集合中的每个点对,给他们随机附上一个相同权值. 两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子) 维护一下子树点 ...

  2. CentOS6和CentOS7安装jumpserver

    1.1 jumpserver安装 同步时间:ntpdate ntp1.aliyun.com 关闭selinux 关闭防火墙 系统字体修改成英文 1.1.1 安装依赖(前提需要epel源) yum in ...

  3. linux的学习之路--(五)bash及其特性

    操作系统组成作用shell是离用户最近的程序 shell:外壳 两类 GUI:Gnome,KDE,Xfce CLI:sh, csh,ksh,bash(都是程序,就是功能支持的不同而已) 进程:在每个进 ...

  4. 剑指Offer-对称的二叉树

    package Tree; /** * 对称的二叉树 * 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. */ public class ...

  5. nodejs加密Crypto简单例子

    加密技术通常分为两大类:“对称式”和“非对称式”. 对称式加密: 就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是 ...

  6. vs调试正确显示utf8格式字符串

    自从将visual studio从2010升级到2015后,发现调用接口的utf8格式字符串不能正常显示了,常常被莫名其妙截断,查了下,原来可以直接将变量拖到watch窗口中,在变量名后面手动添加,s ...

  7. 走近webpack(4)--css相关拓展

    我们前面已经学了很多webpack基本的处理情况,一句话总结就是,一个优秀的webpack项目,主要的核心用法就是整合loader和plugin去处理你想要的任何需求. 下面,咱们一起来学学如何用we ...

  8. 18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)

    在上章17.C++-string字符串类(详解)学习了string类,发现可以通过[ ]重载操作符来访问每个字符. 比如: string s="SAD"; for(int i=0, ...

  9. 连不上虚拟机中的Redis的原因分析、以及虚拟机网络配置

    1. 网络最好是桥接方式.我之前用的是"网络地址转换(NAT)",导致虚拟机里用命令ifconfig得到的ip是10.0.2.15,好奇怪的感觉,然后在真实机上一直连不上.有的说用 ...

  10. 【Python】 压缩文件处理 zipfile & tarfile

    [zipfile] 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩(或者打包)文件格式也都可以处理. zipfile模块常用的一些操作和方法: is_zipfile(file ...