ITPUB论坛-中国最专业的IT技术社区

 手机号登录  找回密码
 注册
查看: 7103|回复: 2

[精华] 做一个开发人员认可的测试人员(系列4) ---也谈内存泄露

[复制链接]
认证徽章
论坛徽章:
64
罗罗诺亚·索隆
日期:2017-09-07 16:40:52itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03祖国65周年纪念徽章
日期:2014-09-28 15:11:01ITPUB14周年纪念章
日期:2015-10-26 17:23:44青年奥林匹克运动会-五人制曲棍球
日期:2014-09-12 15:36:032014年世界杯参赛球队:克罗地亚
日期:2014-06-26 18:34:17马上有钱
日期:2014-05-19 14:56:35马上有车
日期:2014-05-06 21:46:21
发表于 2011-10-27 11:27 | 显示全部楼层 |阅读模式
本帖最后由 crazypeter2005 于 2011-10-27 14:06 编辑

内存泄露就是程序员拿了操作系统的东西忘记还了。要是人人都像《无间道》里面说的那样:“出来混迟早都是得还的”,那么至少我工作的1/3的时间久没事可干了。
       学过C++的人都知道堆区和栈区。
       1.gif
      一般而言,栈区的内存分配是OS来负责的,咱们不用管。堆区的是咱们New或者Allocate出来的,咱们得还。
      很多人认为Java有回收机制就不会内存泄露了,果真如此吗?等下我们再揭晓。
       2.gif

   上图中只有New出来的才会放在堆区,放在栈区的我们不用管,OS自己会去收拾的。
   一般的内存泄露都在Heap区域上面。
    3.gif
  下面分别看看这几种:
4.gif
定义的s没赋初值,直接删除就是非引用内存的错误。这是C++独有的。
5.gif
就想想成一个胖子不断的吃东西,永远不停止,肯定会撑破肚皮的。
这常常见于一个循环内部不停的塞东西给容器。
不少服务器端的程序只是在用户注销的时候才去销毁一些东西,那么在退出之前表现状态来看就是不停的内存在增大。
6.gif
在上面的语句中,是s会内存泄露还是sa呢?
应该是sa,为啥?上面强调很多次了,sa是New出来的,在堆区上啊。
7.gif
GC算法就类似于磁盘碎片整理,不同的公司的GC算法的不同造就不同的JDK,除了Sun的还有IBM和Oracle的。
主要也就是算法的不同。

如何诊断内存泄露呢?
8.gif
  事实证明,代码走审是最有效的办法。比如上面的2处的非引用内存的释放。用肉眼看出来比工具要快。

9.gif

如何抓住微小的内存泄露呢?只能用“聚沙成塔”**了。


在实际测试中,很可能是特殊的路径或者条件才会触发内存泄露。
比如你的代码没有处理空(NULL),当输入为空的时候,依旧去处理就可能造成泄露。

对于API测试,如何发现内存泄露呢?
最重要的是时间问题,内存泄露需要时间去诊断和定位。
比如你跑的是DB的CRUD(Create,Retrieve,Update,Delete)操作。 你发现存在明显的内存泄露了,咋办呢?
二分法,把你的操作里面分为 CD和RU 2组。
这个时候,之前博客讲的分硬币的逻辑就体现在这里了。

同时为了让泄露的效果更明显,你也可以人为的把跑的API的数量增加,让效果更明显。
比如很快你就发现5用户去Delete的时候,内存飞速上升,很快就从几M变成几百M,那么此时你就断定了Delete发生泄露了。

然后就得去最近的几个版本去找从那段代码导致的泄露问题。
基本上这是一个逐渐逼近的办法。
所以对于系统测试,灵活的项目安排必须保证足够的时间缓冲用于这种长期定位的缺陷。
10.gif
内存泄露不该用时间来统计:一小时Leak100M。这个在快的机器上就会比慢的机器多做好多次呢。
应该用次数来统计,做了1000次,Leak了200M。
如果这是跑在服务器端的核心应用,你就等着程序吃掉全部的系统内存然后死掉吧。

如果开发的拿到内存泄露或者说你就是测试兼职开发的咋办呢?
有以下工具推荐使用

11.gif
这个对于exe类型的内存泄露很有用处,它的目的就是怀疑一切,否定一切,经常拿微软的dll开刀,当然了最后一般都是我等小民的代码有问题的。

第二个就是Java的HeapAnalyser
12.gif
这个一般都是分析Dump文件用的。
如果想实时的分析,得用Jprofile:
13.gif

其实调用第三方库也很可能引入内存泄露,
很简单的例子就是COM里面,BSTR的引用者得在外面显示释放不然就很容易内存泄露。所以COM里面还是得用CComBSTR的好。

内存泄露可大可小,对于客户端的泄露,不大的话可以不去费力诊断定位修复,但是对于服务器端的关键应用还是得注意。

值得注意的是很多人在写了一个简单的泄露内存的exe程序运行起来后发现一旦最小化这个exe程序,内存就变小了。
这其实是MS的某个API搞的鬼。
不少内存工具也是拿这个闹事。把内存的东西倒腾到硬盘,然后清空内存。

过会儿换页在读进去内存。这是后话了。
认证徽章
论坛徽章:
1009
紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:48:45紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-10-15 14:45:48
发表于 2011-10-27 13:46 | 显示全部楼层
图片全挂了,LZ再检查一下

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:342013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2014-07-01 08:57:44
发表于 2012-11-23 09:37 | 显示全部楼层

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表