一种基于内存使用传播分析的Java内存低效使用检测方法

文档序号:10512067阅读:206来源:国知局
一种基于内存使用传播分析的Java内存低效使用检测方法
【专利摘要】一种基于内存使用传播分析的Java内存低效使用检测方法。本发明提供一种基于内存使用传播分析的内存低效使用检测方法,包括下列步骤:1)对软件进行静态分析进行插桩,通过动态执行获得内存使用相关的事件信息;2)依据获得的信息进行内存使用传播分析,构建内存使用传播图;3)对内存使用传播图包含的内存使用信息进行特征分析识别,检测软件中的内存低效使用问题;4)对软件进行上下文路径分析,检测导致问题产生的根本原因,对问题进行定位和修复。本发明目前存在的测试方法不能有效检测软件内存低效使用的问题,大幅提升软件的性能和扩展性,提高了软件测试工作效率,从而更好地控制产品的质量。
【专利说明】
一种基于内存使用传播分析的Java内存低效使用检测方法
技术领域
[0001] 本发明属于软件测试技术领域,且特点是发明了一种基于内存使用传播分析的 Java内存低效使用检测方法。
【背景技术】
[0002] 软件测试是一项旨在帮助软件从业者评估被测软件的质量状况的探究性活动。在 完整的软件开发流程中,软件测试活动贯穿始终,占据了软件开发项目的大部分时间,需要 大量的人力物力资源投入。优秀、成功的软件测试过程能够找出被测试软件产品中存在的 错误、缺陷、失效和事故,从而帮助软件产品开发者对软件产品进行合理有效的修复与改 善,并提高软件产品的质量,缩短开发出的软件产品与产品需求之间的差距,将开发出的软 件产品的质量与功能偏差控制在可接受范围以内。
[0003] 内存低效使用是指程序执行过程中存在大量冗余的内存消耗,即内存消耗与这些 内存对程序正常执行带来的贡献不平衡(例如过度的内存消耗来完成简单的程序任务)。现 代软件系统越来越复杂,大型框架密集型软件越来越多,使得内存低效使用问题普遍存在。 大量的研究表明内存低效使用问题会影响软件的运行性能,且难以诊断和修复。随着程序 的执行规模不断扩大,如果程序中的内存低效使用问题在高运行负荷下集中触发,将导致 程序性能显著降低,阻碍达到预期的性能指标,甚至引发程序崩溃。因此,针对内存低效使 用问题进行研究至关重要。

【发明内容】

[0004] 本发明目的在于提供一种基于内存使用传播分析的Java内存低效使用检测方法, 本发明目前存在的测试方法不能有效检测软件内存低效使用的问题,大幅提升软件的性能 和可扩展性,提高了软件测试工作效率,从而更好地控制产品的质量。
[0005] 为达成上述目的,本发明提出一种基于内存使用传播分析的Java内存低效使用检 测方法。方法包括下列步骤: 1)内存使用相关的信息的采集,对Java程序的字节码文件进行静态分析,通过对其中 与内存使用相关的语句进行插粧来进行信息获取。由于面向对象程序的内存消耗主要是对 象的创建和使用所导致的,且对象由方法和字段组成。因此,获取涉及内存使用的三种事 件:对象创建、方法调用和字段访问。
[0006] 2)内存使用传播图(MUPG)的构建,使用步骤1)获得的内存使用信息,通过消除冗 余对内存使用信息进行简化,将其聚合为内存使用传播图(MUPG, Memory Usage Propagation Profiling) JUPG的构建包含两个部分:聚合内存使用事件和聚合循环结构。
[0007] 3)特征分析,程序内存低效使用主要表现为对象内存消耗量与其带来的程序执行 贡献之间的不平衡,通过内存访问率、内存利用率和临时内存分配率三类特征分析,检测程 序中可能存在的内存低效使用问题; 特征分析1:内存访问率 内存访问率(Memory Access Rate, MAR)的计算公式为:
其中,(Μ?+Λ?Ο表示对象类型总的被访问次数,其为方法调用次数(MC)与字段访 问次数(MG )之和,〃表示创建的对象数目; 特征分析2:内存利用率 内存利用率(Memory Utilization Rate, MUR)的计算公式为:
其中,(? -0表示对象类型的有效利用时间,:?为该对象类型最初被利用的时间点,? 为该对象类型最后被利用的时间点。(务表示该对象类型对象总的存在时间,其 中/ee _?表示该对象类型最后一个对象被释放的时间点,iegjn__i表示该对象类型第一个对 象被创建的时间点。
[0008] 特征分析3:临时内存分配率 临时内存分配率(Temporary Memory Allocation Rate, TMAR)的计算公式为:
其中,巧/心,)表示程序执行过程中第i个GC时刻某一对象类型保持引用的对象数目( 况)与该时刻已经创建对象数目(力叫)的比值,I表示程序完整执行过程中的GC次数; 通过以上三类特征分析,检测出导致程序内存低效使用的可疑对象类型。在得到可疑 对象类型之后,依据对象类型的对象数目对可疑的对象类型进行重要性排序; 4)上下文路径分析,由步骤3)得到存在内存低效使用问题的可疑对象类型之后,依据 MUPG提供的上下文信息进行内存使用传播分析,研究这些对象类型受到哪些程序区域的影 响,分析导致内存低效使用的程序区域。在内存使用传播分析时,对每一个路径分支计算其 重要度值W,通过设置阈值,过滤掉那些对内存消耗影响较小的路径,得到造成内存低效使 用的关键路径。
[0009] 设节点A为待分析节点,其被多个父节点调用,B为A的一个父节点,则父节点B对子 节点A的重要度值甿的计算公式为:
其中,表示节点B与节点A之间路径执行的次数,#.?表示节点A与其某一父节点i之 间路径执行的次数,N表示节点A的父节点的总个数。
[0010]上下文路径分析的具体过程为:将阈值、待分析节点和MUPG作为输入,路径分析结 果作为输出。在路径分析过程中,设置阈值t,只有当分析节点的父节点的W值达到或超过t 时,才继续对该父节点进行路径分析。最终得到造成内存低效使用的主要程序执行路径。
[0011] 进一步,其中上述步骤1)的具体步骤如下: 步骤1)-1:起始状态; 步骤1) -2:对Java软件进行静态分析,对其中涉及内存使用的语句进行插粧; 步骤1 )-3:执行程序,在程序执行过程中获得内存使用事件信息; 步骤1)-4:将每条内存使用事件消息的内容,时间等信息存入到数据库; 步骤1)-5:软件内存使用事件消息的获取完毕; 进一步,其中上述步骤2)的具体步骤如下: 步骤2)-1:起始状态; 步骤2)-2:从数据库中读取未进行处理过的内存使用事件消息; 步骤2)-3:依据内存使用事件的类型、事件发生所在的静态地址对获得的信息进行聚 合处理; 步骤2)-4:分析聚合处理后的信息直接的依赖关系,检测其中是否存在循环结构,如果 存在,对其中的循环结果进行聚合处理; 步骤2)-5:内存使用传播图生成完毕; 进一步,其中上述步骤3)的具体步骤如下: 步骤3)-1:起始状态; 步骤3)-2:对于生成的软件内存使用传播图,通过内存访问率、内存利用率和临时内存 分配率三类特征分析,检测图中的节点包含的对象集合是否存在内存低效使用问题。计算 方法如下:对于内存使用传播图中的每一个节点,分析计算其三类特征值的大小: 特征值1:内存访问率 特征值2:内存利用率

特征值3:临时内存分配率
步骤3)-3:根据软件的实际内存使用情况选定一个特征分析的阈值η; 步骤3)-4:将各个节点的特征分析值与η进行比较,如果特征分析值小于阈值η,则将 其列为存在内存低效使用问题的可疑节点; 步骤3)-5:将所有的可疑节点按照消耗的内存大小进行排序,得到可疑内存低效使用 的节点列表; 进一步,其中上述步骤4)的具体步骤如下: 步骤4)_1:起始状态; 步骤4)-2:读取已经获得的可疑对象类型节点报告列表; 步骤4)-3:获得与可疑对象类型相关的重要对象创建地址(按照创建的对象数目大小 进行排序)和对象使用地址(按照执行次数的大小进行排序); 步骤4)-4:对每个可疑对象类型的对象创建地址和对象使用地址进行上下文路径分 析; 步骤4)-5:在路径分析过程中通过设置阈值,计算路径分支的重要度值,获得重要路 径; 步骤4)-6:将导致内存低效使用的上下文路径信息报告给负责开发人员; 本发明使用程序插粧的方法来收集软件运行过程中的内存使用事件信息,可以有效的 对程序的内存使用情况进行监控;使用内存使用传播分析的方法来研究软件运行过程中内 存消耗的具体过程,并通过特征分析的方法对软件中存在内存低效使用的区域进行定位; 最后对检测出的可疑对象类型进行上下文路径分析,得到导致问题产生的根本原因,帮助 软件开发人员进行缺陷修复,提高了软件测试工作效率,从而更好地控制产品的质量。
[0012]
【附图说明】
[0013] 图1为本发明实施例的一种基于内存使用传播分析的Java内存低效使用检测方法 的流程图。
[0014] 图2为图1中软件内存使用消息的采集的流程图。
[0015]图3为图1中软件内存使用传播图构建的流程图。
[0016] 图4为图1中软件特征分析的流程图。
[0017] 图5为图1中软件上下文路径分析的流程图。
[0018]
【具体实施方式】
[0019] 为了更了解本发明的技术内容,特举具体实施例并配合所附图式说明如下。
[0020] 图1为本发明实施例的一种基于内存使用传播分析的Java内存低效使用检测方法 的流程图。
[0021] -种基于内存使用传播分析的Java内存低效使用检测方法,其特征在于,包括下 列步骤: S101内存使用相关的信息的采集,对Java程序的字节码文件进行静态分析,通过对其 中与内存使用相关的语句进行插粧来进行信息获取。由于面向对象程序的内存消耗主要是 对象的创建和使用所导致的,且对象由方法和字段组成。因此,获取涉及内存使用的三种事 件:对象创建、方法调用和字段访问。; S103内存使用传播图的构建,使用步骤1)获得的内存使用信息,通过消除冗余对内存 使用信息进行简化,将其聚合为内存使用传播图。内存使用传播图的构建包含两个部分:聚 合内存使用事件和聚合循环结构; S105特征分析,对于生成的软件内存使用传播图,通过内存访问率、内存利用率和临时 内存分配率三类特征分析,检测图中的节点包含的对象集合是否存在内存低效使用问题, 并对节点进行重要性排序; S107上下文路径分析,依据特征分析得到的存在内存低效使用的可疑节点排名,对节 点进行上下午路径分析,得到导致程序内存低效使用的根本原因。并将分析结果与程序源 码信息结合,将详细的诊断结果报告给软件开发人员进行问题理解和修复。
[0022] 图2为对内存使用相关的信息进行采集的流程图。通过对Java程序的字节码文件 进行插粧,对与内存使用相关的对象创建、方法调用和变量访问三类事件进行监控,并存储 到数据库中。具体步骤如下: 步骤1:起始状态;步骤2:对Java软件进行静态分析,对其中涉及内存使用的语句进行 插粧;步骤3:执行程序,在程序执行过程中获得内存使用事件信息;步骤4:将每条内存使用 事件消息的内容,时间等信息存入到数据库;步骤5:软件内存使用事件消息的获取完毕; 图3为构建内存使用传播图的流程图,使用步骤1)获得的内存使用信息,通过消除冗余 对内存使用信息进行简化,将其聚合为内存使用传播图。具体步骤如下: 步骤1:起始状态;步骤2:从数据库中读取未进行处理过的内存使用事件消息;步骤3: 依据事件的类型、事件发生所在的静态地址对获得的信息进行聚合处理;步骤4:分析聚合 处理后的信息直接的依赖关系,对其中的循环结构进行聚合处理;步骤5:内存使用传播图 生成完毕。
[0023] 图4为特征分析的流程图。对于生成的软件内存使用传播图,通过内存访问率、内 存利用率和临时内存分配率三类特征分析,检测图中的节点包含的对象集合是否存在内存 低效使用问题,并对节点进行重要性排名。具体步骤如下: 步骤1:起始状态;步骤2:通过三类特征分析,得到内存使用传播图中各个节点的三类 特征值大小;步骤3:根据软件的实际内存使用情况选定一个特征分析的阈值η;步骤4:将各 个节点的特征值与η进行比较,找出存在内存低效使用问题的可疑节点;步骤5:将可疑节点 按照内存消耗大小进行排序,得到可疑内存低效使用的节点列表;步骤6:内存使用传播图 构建完毕。
[0024] 图5上下文路径分析的流程图。依据特征分析得到的存在内存低效使用的可疑节 点排名,对节点进行上下午路径分析,得到导致程序内存低效使用的根本原因。并将分析结 果与程序源码信息结合,将详细的诊断结果报告给软件开发人员。具体步骤如下: 步骤1:起始状态;步骤2:读取获得的可疑对象类型节点报告列表;步骤3:获得可疑对 象类型相关的对象创建地址和对象使用地址;步骤4:对每个可疑对象类型的对象创建地址 和对象使用地址进行上下文路径分析;步骤5:在路径分析过程中通过设置阈值,计算路径 分支的重要度值,获得重要路径;步骤6:将导致内存低效使用的上下文路径信息报告给负 责开发人员;步骤7:上下文路径分析完毕。
[0025] 综上所述,本发明解决了目前存在的软件内存低效使用问题难以检测的问题,不 仅大幅提高了软件内存低效使用问题检测的效率和准确性,而且提升了软件内存问题检测 的自动化程度,进而提高了软件测试工作效率,从而更好地控制产品的质量。
【主权项】
1. 一种基于内存使用传播分析的Java内存低效使用检测方法,其特征在于,首先将程 序中的内存使用事件信息抽象为内存使用传播图,以此提供程序完整的内存行为,其次通 过对内存行为进行特征分析识别,检测和确定程序中的内存低效使用问题,最后依据内存 使用传播图提供的上下文路径信息分析导致问题产生的程序区域,自动将软件内存低效使 用缺陷报告分配给对应的软件开发者,软件开发者根据软件缺陷报告定位软件缺陷,并进 行修复;该方法包括下列步骤: 1)内存使用相关的信息的采集,对Java程序的字节码文件进行静态分析,通过对其中 与内存使用相关的语句进行插粧来进行信息获取;程序的内存消耗主要是对象的创建和使 用所导致的,且对象由方法和字段组成;因此,我们获取涉及内存使用的三种事件: ① 对象创建;对象创建是引发堆内存消耗的直接原因,因此对对象创建事件进行监控 可以分析导致程序大量内存消耗的引发点; ② 方法调用;方法调用是程序执行过程中各个数据结构过程间交互的主要方式,也是 对创建的对象进行利用的主要形式,因此对方法调用事件进行监控可以获得程序执行过程 中各个数据结构之间的联系,分析不同程序区域在内存消耗上的关联关系,同时得到对象 的使用情况; ③ 字段访问;对象由方法和字段两部分组成,判断对象是否被使用除了对方法调用事 件进行监控外,监控字段访问也是非常重要的内容; 通过对三类内存使用事件进行监控,可以获得程序执行过程中完整的堆内存使用信 息,即导致内存消耗的具体内存行为; 2 )内存使用传播图(MUPG)的构建; 在获得内存使用事件信后,通过消除冗余对内存使用信息进行简化,将其聚合为内存 使用传播图(MUPG) ;MUPG的构建包含两个部分: (1) 聚合内存使用事件 定义1:聚合内存使用事件包含以下四个关键属性,即描述、环境、输入和输出; 描述:表示软件内存使用的总体描述,用于抽象的表示软件的内存行为,分析软件的内 存使用情况; 环境:包括软件运行的软件环境和硬件环境; 输入:包括获取到的三类内存使用事件信息; 输出:聚合分析后的结果; 使用步骤1)获取到的内存使用事件信息,对相同事件类型根据事件发生的静态地址进 行聚合,并按照描述、环境、输入、输出的格式组织起来,自动组合成一个软件内存使用模 型; (2) 聚合循环结构 程序执行过程中容易出现方法间的循环调用,导致MUPG中包含循环结构;使用强连通 结构检测算法对其中涉及的循环结构进行检测,并使用单一节点进行表示;对于代表各个 循环结构的节点,将其作为一个整体;与步骤1类似,对包含相同内容的循环结构节点进行 分组聚合,使用单一节点进行表示; 3)特征分析; 程序内存低效使用主要表现为对象内存消耗量与其带来的程序执行贡献之间的不平 衡;通过内存访问率、内存利用率和临时内存分配率三类特征分析,检测程序中可能存在的 内存低效使用问题; 特征分析1:内存访问率 程序执行过程中,可能存在一些对象类型创建了大量对象,但这些对象却很少被使用, 显然这是一种内存被低效使用的现象;内存访问率(Memory Access Rate, MAR)即为某一 对象类型被访问次数与该对象类型对象数目之间的比值,比值越小,则说明该对象类型所 消耗的内存被低效使用的可能性越大;MAR的计算公式为: MAR^iMIC + FAC) ?N (1) 其中,(MU+MC0表示对象类型总的被访问次数,其为方法调用次数(Μ·7)与字段访 问次数(me)之和,夂表示创建的对象数目; 特征分析2:内存利用率 程序执行过程中,可能存在一些对象被大量创建后,仅仅只在其生命周期的较短时间 段内被利用,显然这也是一种内存被低效使用的现象;这些对象在结束利用到最后被释放 的较长时间段内,将无益地耗费大量内存资源,对程序的性能造成严重影响;内存利用率 (Memory Utilization Rate, MUR)即为某一对象类型的对象被实际利用的时间与总的存 在时间之间的比值;MUR值的计算公式为:其中,A表示对象类型的有效利用时间,|为该对象类型最初被利用的时间点Λ为 该对象类型最后被利用的时间点,即在卩丨之外的时间段内没有任何关于该对象类型对 象的利用事件发生;表示该对象类型对象总的存在时间,其中/ee _?表示该 对象类型最后一个对象被释放的时间点,砂ι_?表示该对象类型第一个对象被创建的时间 点,g卩在[iegh _i. /ee j]之外的时间段内没有任何该对象类型的对象存在; 特征分析3:临时内存分配率 大量临时对象的创建将导致昂贵的内存资源开销和频繁的垃圾收集,增加程序执行的 负载;检测那些创建了大量对象的对象类型,如果堆内存中保持引用(即未被垃圾收集器回 收)的对象数量远远小于其所创建对象的数量,则表明该对象类型很可能存在大量的临时 对象;临时内存分配率(Temporary Memory Allocation Rate, TMAR)为各个GC时刻对象类 型保持引用的对象数量与该类型总的创建数量之间比值的平均值,TMAR值越小,则说明内 存被低效使用的可能性越大; TMAR值的计算公式为:其中^表示程序执行过程中第i个GC时刻某一对象类型保持引用的对象数目( 气)与该时刻已经创建对象数目(的比值,表示程序完整执行过程中的GC次数; 通过以上三类特征分析,检测出导致程序内存低效使用的可疑对象类型; 在得到可疑对象类型之后,依据对象类型的对象数目对可疑的对象类型进行重要性排 序; 4)上下文路径分析; 在得到可能存在内存低效使用问题的可疑对象类型之后,依据MUPG提供的上下文信息 进行内存使用传播分析,研究这些对象类型受到哪些程序区域的影响,分析导致内存低效 使用的程序区域;为减少分析过程中的资源开销和获得导致内存低效使用的关键原因,只 对与可疑对象类型相关的重要对象创建地址(按照创建的对象数目大小进行排序)和对象 使用地址(按照执行次数的大小进行排序)进行分析;同时,在路径分析时,对每一个路径分 支计算其重要度值W,通过设置阈值,过滤掉那些对内存消耗影响较小的路径,得到造成内 存低效使用的关键路径;设节点A为待分析节点,其被多个父节点调用,B为A的一个父节点, 则父节点B对子节点A的重要度值蹲的计算公式为:(4) 其中,表示节点B与节点A之间路径执行的次数,?%表示节点A与其某一父节点i之 间路径执行的次数,N表示节点A的父节点的总个数;上下文路径分析的具体过程为:将阈 值、待分析节点和MUPG作为输入,路径分析结果作为输出;在路径分析过程中,设置阈值t, 只有当分析节点的父节点的W值达到或超过t时,才继续对该父节点进行路径分析; 最终得到造成内存低效使用的主要程序执行路径。2. 根据权利要求1所述的基于内存使用传播分析的Java内存低效使用检测方法,其特 征在于,在步骤1)中,软件内存使用信息通过对软件进行静态插粧来收集;具体的内存使用 信息包括对象创建、方法调用、变量访问三类事件信息。3. 根据权利要求1所述的基于内存使用传播分析的Java内存低效使用检测方法,其特 征在于,在步骤2)中,对获得的内存使用信息根据内存使用事件类型和静态地址进行分组 聚合,对其中包含的循环结构进行聚合处理,生成内存使用传播图MUPG。4. 根据权利要求1所述的基于内存使用传播分析的Java内存低效使用检测方法,其特 征在于,在步骤3)中,通过三类特征分析,为程序员提供导致程序内存低效使用的可疑对象 类型;同时,依据对象类型的对象数目对可疑的对象类型进行重要性排序。5. 根据权利要求1所述的基于内存使用传播分析的Java内存低效使用检测方法,其特 征在于,在步骤4)中,对于检测出的可疑对象类型,自动分析出导致其内存低效使用的根本 原因;具体步骤如下:通过计算每一个父节点关于子节点的重要度值W,在对可疑对象类型 进行路径分析时,选定一个阈值t,只有当重要度值W大于t的节点才继续进行上下文路径分 析,最终得到造成内存低效使用的主要程序执行路径。
【文档编号】G06F11/30GK105868079SQ201610251576
【公开日】2016年8月17日
【申请日】2016年4月21日
【发明人】姜淑娟, 李文杰, 王兴亚, 鞠小林, 王荣存, 张艳梅
【申请人】中国矿业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1