论文部分内容阅读
随着信息技术的高速发展,软件产品被应用到现代生产生活的各个方面。软件产品的广泛应用又反过来推动了软件的设计、开发、维护、分析等技术的发展。其中面向对象相关的语言、技术、思想占了很重要的位置。我们知道很多流行编程语言都支持面向对象开发。无论是在开源软件、还是在企业应用中,使用现代面向对象语言开发的程序都广泛使用动态分配堆区对象技术。这导致程序动态分析技术,例如内存泄漏分析、自动调试等,依赖各种从堆区获得的有关对象信息。而其中识别堆区差异性的问题是众多重要问题中的一个,而且很多工业级开发工具和开源工具中也提供了一些解决方法。但是,现存的堆区比较工具通常只使用单一信息:要么是只使用对象的地址比较,适用范围小;要么是只使用空间结构信息(访问路径),要么是只使用上下文信息(执行索引)。这些方法只提供相对不太准确的信息,对于动态分析中更高级的要求并不能满足。针对这个挑战,本文提出了一种新的堆区比较方法,该方法结合访问路径和执行索引,提供了精确的堆区对象匹配信息。在此基础上我们设计与实现了针对Java程序的原型工具APEI,并利用该原型工具针对三种不同的动态分析任务进行了案例分析,具体而言,本文的主要工作如下:1.提出了新的堆区对象比较方法:APEI。在分析了现有不同解决方法,特别是分析了基于访问路径的堆区比较方法和基于执行索引的堆区比较方法的基础上,该方法结合两者的优劣,提供更精确的比较信息。2.基于我们新方法的原理,在开源Java虚拟机Open JDK的基础上,实现了一个能够建立执行索引、捕获内存快照并进行堆区对象比较的原型系统。该系统分为在线跟踪器和离线分析器两部分,前者使用了JVMTI开发接口,在运行时记录相关重要信息(对象创建、方法执行等信息);后者使用jhat工具包分析内存快照,解析记录的对象信息,进行对象比较,并最终给出堆内存快照分析统计报告。3.本文进行了详细的案例研究分析。选择现实世界中广泛应用的软件,即Eclipse Compiler for Java(ECJ)、Apache Derby和Apache FTP Server作为研究对象,进行了性能分析、精度比较,并给出了详实的数据。