[发明专利]确定程序中的内存泄漏位置的方法和装置无效
申请号: | 200810144108.2 | 申请日: | 2008-07-29 |
公开(公告)号: | CN101639804A | 公开(公告)日: | 2010-02-03 |
发明(设计)人: | 王成伟;刘天成;罗景;李影;龙泉 | 申请(专利权)人: | 国际商业机器公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 中国国际贸易促进委员会专利商标事务所 | 代理人: | 李镇江 |
地址: | 美国*** | 国省代码: | 美国;US |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 确定 程序 中的 内存 泄漏 位置 方法 装置 | ||
技术领域
本发明总体上涉及确定程序中内存泄漏位置的方法和装置,更具体地涉及通过结合动态分析和静态分析来确定程序中的内存泄漏位置的方法和装置。
背景技术
可靠性是衡量软件系统质量的重要指标,内存泄漏是破坏系统可靠性的重要因素。内存泄漏会降低系统性能,严重时会导致系统崩溃。
程序执行过程中,由于很多变量所需的内存空间在编译时无法确定,操作系统需要为这些变量动态地分配内存。相应地,许多编程语言都有其内存分配/回收机制,变量被创建时分配内存,变量不再需要时释放其所占内存。
程序中不适当的编程项会导致出现内存泄漏,其在不同类型程序中的表现形式不同。比如,在C/C++程序中,内存泄漏是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费。而在Java程序中,通过垃圾收集机制(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存,但是Java软件程序中还是有可能出现内存泄漏。这是因为GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间,而无法处理因编码错误而意外地保存了对该对象的引用的情况。
例如,在Java程序中,循环申请Object对象,并将所申请的对象放入一个Vector中,如果仅仅释放对象本身(将Object设为null),但因为Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Object对象从Vector中删除,即调用Vector中的remove方法。实际上这些对象已经是无用的,但还被引用,GC就无能为力了(事实上GC认为它还有用),这一点是导致Java程序发生内存泄漏最重要的原因之一。
下面说明另外一个Java的内存泄漏的例子。Logger类有一个类型为HashMap的静态变量temp,每次在执行log(message)的时候,都首先将message的值写入temp中(以当前线程+当前时间为键),在退出之前再从temp中将以当前线程和当前时间为键的条目删除。注意,这里当前时间是不断变化的,所以log在退出之前执行删除条目的操作并不能删除执行之初写入的条目。这样,任何一个作为参数传给log的字符串最终由于被Logger的静态变量temp引用,而无法得到回收,这种对象保持也属于上述的Java内存泄漏。
总的来说,Java中的内存泄漏产生的主要原因即保留下来却永远不再使用的对象引用,简单地讲就是因为编码的错误导致了一条本来不应该存在的引用链的存在从而导致了被引用的对象无法释放。因此对Java来说,内存泄漏分析的任务就是找出这条多余的引用链,并找到其形成的原因。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于国际商业机器公司,未经国际商业机器公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200810144108.2/2.html,转载请声明来源钻瓜专利网。
- 上一篇:报表查询方法和装置
- 下一篇:一种手持设备的数据录入和处理方法