[发明专利]一种基于内存使用传播分析的Java内存低效使用检测方法有效
申请号: | 201610251576.4 | 申请日: | 2016-04-21 |
公开(公告)号: | CN105868079B | 公开(公告)日: | 2019-02-26 |
发明(设计)人: | 姜淑娟;李文杰;王兴亚;鞠小林;王荣存;张艳梅 | 申请(专利权)人: | 中国矿业大学 |
主分类号: | G06F11/30 | 分类号: | G06F11/30;G06F11/36 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 221116*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 一种基于内存使用传播分析的Java内存低效使用检测方法。本发明提供一种基于内存使用传播分析的内存低效使用检测方法,包括下列步骤:1)对软件进行静态分析进行插桩,通过动态执行获得内存使用相关的事件信息;2)依据获得的信息进行内存使用传播分析,构建内存使用传播图;3)对内存使用传播图包含的内存使用信息进行特征分析识别,检测软件中的内存低效使用问题;4)对软件进行上下文路径分析,检测导致问题产生的根本原因,对问题进行定位和修复。本发明目前存在的测试方法不能有效检测软件内存低效使用的问题,大幅提升软件的性能和扩展性,提高了软件测试工作效率,从而更好地控制产品的质量。 | ||
搜索关键词: | 一种 基于 内存 使用 传播 分析 java 低效 检测 方法 | ||
【主权项】:
1.一种基于内存使用传播分析的Java内存低效使用检测方法,其特征在于,首先将程序中的内存使用事件信息抽象为内存使用传播图,以此提供程序完整的内存行为,其次通过对内存行为进行特征分析识别,检测和确定程序中的内存低效使用问题,最后依据内存使用传播图提供的上下文路径信息分析导致问题产生的程序区域,自动将软件内存低效使用缺陷报告分配给对应的软件开发者,软件开发者根据软件缺陷报告定位软件缺陷,并进行修复;该方法包括下列四个步骤:步骤1:内存使用相关的信息的采集;对Java程序的字节码文件进行静态分析,通过对其中与内存使用相关的语句进行插桩来进行信息获取;程序的内存消耗主要是对象的创建和使用所导致的,且对象由方法和字段组成;因此,我们获取涉及内存使用的三种事件:①对象创建;对象创建是引发堆内存消耗的直接原因,因此对对象创建事件进行监控可以分析导致程序大量内存消耗的引发点;②方法调用;方法调用是程序执行过程中各个数据结构过程间交互的主要方式,也是对创建的对象进行利用的主要形式,因此对方法调用事件进行监控可以获得程序执行过程中各个数据结构之间的联系,分析不同程序区域在内存消耗上的关联关系,同时得到对象的使用情况;③字段访问;对象由方法和字段两部分组成,判断对象是否被使用除了对方法调用事件进行监控外,监控字段访问也是非常重要的内容;通过对三类内存使用事件进行监控,可以获得程序执行过程中完整的堆内存使用信息,即导致内存消耗的具体内存行为;步骤2:内存使用传播图的构建;在获得内存使用事件信息后,通过消除冗余对内存使用信息进行简化,将其聚合为内存使用传播图;内存使用传播图的构建包含两个部分;(1)聚合内存使用事件定义1:聚合内存使用事件包含以下四个关键属性,即描述、环境、输入和输出;描述:表示软件内存使用的总体描述,用于抽象的表示软件的内存行为,分析软件的内存使用情况;环境:包括软件运行的软件环境和硬件环境;输入:包括获取到的三类内存使用事件信息;输出:聚合分析后的结果;使用步骤1获取到的内存使用事件信息,对相同事件类型根据事件发生的静态地址进行聚合,并按照描述、环境、输入、输出的格式组织起来,自动组合成一个软件内存使用模型;(2)聚合循环结构程序执行过程中容易出现方法间的循环调用,导致内存使用传播图中包含循环结构;使用强连通结构检测算法对其中涉及的循环结构进行检测,并使用单一节点进行表示;对于代表各个循环结构的节点,我们将其作为一个整体;与步骤1类似,对包含相同内容的循环结构节点进行分组聚合,使用单一节点进行表示;步骤3:特征分析;程序内存低效使用主要表现为对象内存消耗量与其带来的程序执行贡献之间的不平衡;本节通过内存访问率、内存利用率和临时内存分配率三类特征分析,检测程序中可能存在的内存低效使用问题;特征分析1:内存访问率在程序执行过程中,可能存在一些对象类型创建了大量对象,但这些对象却很少被使用,显然这是一种内存被低效使用的现象;内存访问率(Memory Access Rate,MAR)即为某一对象类型被访问次数与该对象类型对象数目之间的比值,比值越小,则说明该对象类型所消耗的内存被低效使用的可能性越大;MAR的计算公式为:MAR=(MIC+FAC)/N其中,(MIC+FAC)表示对象类型总的被访问次数,其为方法调用次数MIC与字段访问次数FAC之和,N表示创建的对象数目;特征分析2:内存利用率在程序执行过程中,可能存在一些对象被大量创建后,仅仅只在其生命周期的较短时间段内被利用,显然这也是一种内存被低效使用的现象;这些对象在结束利用到最后被释放的较长时间段内,将无益地耗费大量内存资源,对程序的性能造成严重影响;内存利用率(Memory Utilization Rate,MUR)即为某一对象类型的对象被实际利用的时间与总的存在时间之间的比值;MUR值的计算公式为:MUR=(t2‑t1)/(free_t‑begin_t) (2)其中,(t2‑t1)表示对象类型的有效利用时间,t1为该对象类型最初被利用的时间点,t2为该对象类型最后被利用的时间点,即在[t1,t2]之外的时间段内没有任何关于该对象类型对象的利用事件发生;(free_t‑begin_t)表示该对象类型对象总的存在时间,其中free_t表示该对象类型最后一个对象被释放的时间点,begin_t表示该对象类型第一个对象被创建的时间点,即在[begin_t,free_t]之外的时间段内没有任何该对象类型的对象存在;特征分析3:临时内存分配率大量临时对象的创建将导致昂贵的内存资源开销和频繁的垃圾收集,增加程序执行的负载;我们检测那些创建了大量对象的对象类型,如果堆内存中保持引用的对象数量远远小于其所创建对象的数量,则表明该对象类型很可能存在大量的临时对象;临时内存分配率(Temporary Memory Allocation Rate,TMAR)为各个GC时刻对象类型保持引用的对象数量与该类型总的创建数量之间比值的平均值,TMAR值越小,则说明内存被低效使用的可能性越大;TMAR值的计算公式为:
其中,(Ni/Sumi)表示程序执行过程中第i个GC时刻某一对象类型保持引用的对象数目Ni与该时刻已经创建对象数目Sumi的比值,NGC表示程序完整执行过程中的GC次数;通过以上三类特征分析,检测出导致程序内存低效使用的可疑对象类型;在得到可疑对象类型之后,依据对象类型的对象数目对可疑的对象类型进行重要性排序;步骤4:上下文路径分析在得到可能存在内存低效使用问题的可疑对象类型之后,依据内存使用传播图提供的上下文信息进行内存使用传播分析,研究这些对象类型受到哪些程序区域的影响,分析导致内存低效使用的程序区域;为减少分析过程中的资源开销和获得导致内存低效使用的关键原因,对与可疑对象类型相关的重要对象创建地址按照创建的对象数目大小进行排序并按照排序顺序进行分析;对与可疑对象类型相关的对象使用地址按照执行次数的大小进行排序并按照排序顺序进行分析;同时,在路径分析时,对每一个路径分支计算其重要度值W,通过设置阈值,过滤掉那些对内存消耗影响较小的路径,得到造成内存低效使用的关键路径;设节点A为待分析节点,其被多个父节点调用,B为A的一个父节点,则父节点B对子节点A的重要度值
的计算公式为:
其中,
表示节点B与节点A之间路径执行的次数,
表示节点A与其某一父节点i之间路径执行的次数,N表示节点A的父节点的总个数;上下文路径分析的具体过程为:将阈值、待分析节点和内存使用传播图作为输入,路径分析结果作为输出;在路径分析过程中,设置阈值t,只有当分析节点的父节点的W值达到或超过t时,才继续对该父节点进行路径分析;最终得到造成内存低效使用的主要程序执行路径。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国矿业大学,未经中国矿业大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201610251576.4/,转载请声明来源钻瓜专利网。