论文部分内容阅读
伴随着计算机技术的快速发展,计算机软件所解决的问题日益复杂,软件的功能、结构和行为的复杂性不断增加,使得大规模框架密集型应用程序得到广泛应用。这些应用程序通常结合了标准类库和特定领域的第三方框架。虽然类库和框架的使用简化了开发工作,但调用这些类库和框架的通用API的代价可能是非常昂贵的。程序员在软件开发过程中往往过多关注于系统的功能实现,忽视对程序进行优化设计,并将性能优化的任务交给运行时系统,导致因不合理的内存使用所导致的内存问题在软件中广泛存在。软件复杂性的增加对软件分析和测试过程中理解软件的内存行为和检测内存使用问题提出了新的挑战。对于现代软件系统而言,如何快速理解软件的内存行为,准确检测出软件中的内存使用问题对于保证软件质量具有重要意义。目前,软件内存使用分析已经在国内外被大量学者广泛研究:一方面,通过程序分析技术研究程序中各个数据结构之间的依赖关系,借助这些信息识别程序中的不合理的设计;另一方面,通过充分的测试用例测试获取足量的动态执行信息,对程序的执行信息采用特征分析或统计分析的方法研究程序的内存使用。但是,已有的这些方法依然存在一些问题。主要表现在:(1)资源开销较大。Java程序执行过程中涉及大量对象的创建和使用,包含复杂的对象引用关系,使得一些方法在内存使用分析过程中需要大量的资源开销;(2)提供的诊断信息有限。一些方法的诊断信息只能提供与内存使用相关的类级别信息,诊断信息较为抽象。此外,检测报告缺乏与问题相关的上下文信息,难以辅助调试人员进行问题理解和问题修复;(3)诊断结果的准确性有待提高。已有研究方法往往通过内存使用问题的某一特征点进行问题的识别,检测结果的准确性和有效性较低。针对以上问题,本文进行了以下两个方面的研究:(1)设计了一种基于对象引用关系的Java程序内存行为分析方法。与传统的依据内存消耗的大小确定程序中数据结构的重要性并分析相关内存行为的方法不同,该方法同时考虑内存消耗和内存支配两个因素来确定一个数据结构在程序内存行为中的重要性,通过研究数据结构之间在内存使用上的支配关系和对数据结构进行引用分析,得到程序中重要的内存行为。实验结果表明该方法对程序中重要内存行为的分析具备良好的效果。(2)设计了一种基于内存使用传播分析的Java内存低效使用检测方法。与原有的通过检测程序中消耗内存较多的数据结构并分析其内存使用合理性的方法不同,该方法首先获取程序执行过程中的内存使用信息,并将其抽象为内存使用传播图(Memory Usage Propagation Graph,MUPG),以此提供程序完整的内存行为;其次通过对MUPG包含的内存使用信息进行特征分析识别,检测和确定程序中的内存低效使用问题;最后依据MUPG提供的上下文路径信息分析导致问题产生的根本原因。实验结果表明该方法在内存低效使用问题检测上具有较好的效果。本课题设计了两种程序内存使用分析技术以帮助软件开发人员对Java程序的内存使用进行分析,揭示潜在的内存低效使用问题,并找出导致这些问题产生的根源。虽然这些技术的实现都是针对Java程序进行,但我们相信提供的技术也能适用于其它面向对象语言编写的系统。