一个毕生难忘的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 ...
随机推荐
- 【NOIP2012】开车旅行(倍增)
题面 Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 ...
- 状压dp入门
状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...
- testng及JMeter使用之初体验
这里只是简单的说下我再项目中使用testng的JMeter使用的情况, 主要的是使用JMeter的体验, 都是以截图和文字为说明的. 1, 性能测试之testng 直接可以 ...
- 【python学习笔记】3.字符串使用
[python学习笔记]3.字符串使用 字符串是一种序列,素有标准的序列操作对字符串用样适用,字符串是不可以改变 格式化操作符,%,左侧是格式化字符串,右侧是被格式的值,可以是一个值.元组.字典 数值 ...
- 如何彻底关闭windows defender
我是一个喜欢裸奔的人,我不喜欢使用那些安全软件,什么360啊,什么毒霸啊让我深恶痛绝,就连windows自带的杀软我都不能忍啊,因为我平时喜欢找一下软件,很多的补丁和注册机,这些安全软件都会误报,所以 ...
- Excel IF函数怎么用
本例主要介绍Excel表格中IF函数的用法,包括基本用法.单条件.多条件表达及在数组函数中的用法和在数组函数中怎么表达多条件和单条件. 工具/原料 Excel IF函数语法介绍: 1 IF函数 ...
- 关于Sql server数据 MD5加密
最近在写一个web项目时,需要在数据库中将用户密码等一类信息进行加密处理.数据加密算法有许多 ,各有各的优缺点;在 http://www.cnblogs.com/yangywyangyw/arch ...
- Python机器学习中文版目录
建议Ctrl+D保存到收藏夹,方便随时查看 人工智能(AI)学习资料库 Python机器学习简介 第一章 让计算机从数据中学习 将数据转化为知识 三类机器学习算法 第二章 训练机器学习分类算法 透过人 ...
- Keepalived+Nginx实现高可用负载均衡集群
一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+nginx双主高可用负载均衡集群及LAMP应用keepalived-1 ...
- 关于IPFS, 你想知道的都在这里
IPFS的的"宏伟"目标是取代HTTP, 那么先来看看IPFS是如何工作的? IPFS为每一个文件分配一个独一无二的哈希值(文件指纹: 根据文件的内容进行创建), 即使是两 ...