论文部分内容阅读
虽然Java语言有自己的垃圾回收机制,但是在Java软件中仍然存在着内存泄漏问题。Java的内存泄漏主要因无用对象没有断开引用造成。它可能影响程序的正常执行,特别是对于那些长期运行的程序,内存泄漏可能造成可用内存不足,影响程序性能,甚至导致程序崩溃。鉴于内存泄漏错误的严重性,必须对其进行研究,寻找解决泄漏的有效方法,从而最终提高软件质量。目前对Java内存泄漏的研究大都集中在发现泄漏现象之后的泄漏原因定位及泄漏修复上,而关于如何通过测试等手段发现泄漏现象的研究极少。不先发现内存泄漏现象的存在,就无法展开泄漏原因的定位及泄漏修复研究。在通过测试发现泄漏现象方面,目前判定程序是否存在泄漏主要依靠测试人员的经验。少数研究利用断言系统为泄漏判定提供部分支持,但它们大都需要用户对软件细节具有深入理解,而且判定是否存在泄漏的断言代码散布在程序中,难以维护。 本文定义了一种新的泄漏规约语言LeakSpec,并且开发了一个支持该规约语言的规约检查器LeakSpecTool,将经验性的人工泄漏判定,转化为基于规约语言的自动泄漏判定。泄漏规约语言语法与AspectJ类似,支持针对检查点和事务的规约,具有较强的表达能力与抽象性,利于用户编写自己的规约来测试软件中是否存在内存泄漏。同时我们也提供一个运行时(runtime)系统来帮助用户完成对待测试软件的内存信息的获取,使用户能更容易的编写规约文件。LeakSpecTool工具可以加载用户编写的规约与被测试软件一起运行来完成对内存泄漏的测试发现。利用AOP技术,规约系统可以使用户在不改变源码的基础上完成对软件的内存泄漏测试。我们在开源软件上进行了实验论证,结果表明本文的泄漏规约及工具能比较有效地支持Java软件的内存泄漏发现。