本发明专利技术公开了一种Web应用的内存泄漏定位方法,该方法包括四个阶段:Web应用加载时插桩、使用脚本驱动Web应用工作、跟踪Web应用内存使用、可疑对象排序得到内存泄漏定位结果。本发明专利技术充分考虑了Web应用程序的结构特征和使用特征,通过在泄漏定位过程中对内存对象进行时空维度过滤,达到提高内存泄漏定位精确度的目的。
Memory leak locating method for Web application
The invention discloses a Web application memory leak location method, the method includes four stages: Web application loaded stub, using the script driven Web application, Web application memory usage, tracking suspicious object sort memory leak location results. The invention fully considers the structure characteristics and the use characteristics of the Web application program, and improves the memory leak positioning accuracy through filtering the memory object in the time and space dimension in the leakage positioning process.
【技术实现步骤摘要】
一种Web应用的内存泄漏定位方法
本专利技术属于计算机软件开发领域,特别涉及了一种Web应用的内存泄漏定位方法。
技术介绍
Web应用是一类典型的容易包含内存泄漏问题的应用程序。其对外提供长期的服务,即使每次被调用仅泄漏微小的内存,Web应用也可能在外部用户的长时间使用下,损失大量内存,造成严重后果。内存泄漏可导致Web应用程序宕机,无法继续对外提供功能服务,带来经济和社会效益损失。为解决内存泄漏问题,提高性能表现,改善系统可用性,必须对内存泄漏问题的诊断定位技术进行研究,以排除泄漏。在此方面,人们已对一般应用程序上的内存泄漏诊断定位技术进行了许多研究,取得了不少重要研究成果,也研发了多种相关工具,例如EJTechnique公司的JProfiler、IBM公司的ApplicationDeveloper、Eclipse基金会的MAT工具等。大多数内存泄漏定位方法根据对象的内存占用排序来定位风险泄漏对象,最可能造成泄漏的是那些占用内存非常多的对象类型。现有技术和工具尽管针对一般应用程序有较好的性能表现,理论上也支持Web应用的分析,但其在分析Web应用的内存泄漏方面,仍有许多不足。一个主要的问题是现有方法未能充分考虑Web应用程序的结构特征和使用特征。一方面,在定位内存泄漏时,会将Web容器中间件(如Tomcat)自身的对象与容器中Web应用的对象混在一起进行分析,分析结果容易受中间件自身对象的影响,常常将不太可能造成泄漏的容器中间件创建的内存对象汇报为泄漏源,而无法定位出真正的Web应用程序中的泄漏对象。(诸如Tomcat的Web容器通常经过严格测试,久经验证,容器本身不太可能造成内存泄漏,泄漏源一般在用户编写的Web应用程序上。)另一方面,Web应用程序不像一般应用程序那样,每次执行都重新启动进程,一轮测试的结果不会受历史执行的影响。对于Web应用程序,多次执行测试的过程中,应用程序本身并未重新启动,历史执行分配的许多对象仍然存活,可能影响新测试执行上的内存泄漏定位。因此,对于泄漏诊断,必须尽可能隔离历史测试执行的影响,以提高内存泄漏定位精度。
技术实现思路
为了解决上述
技术介绍
提出的技术问题,本专利技术旨在提供一种Web应用的内存泄漏定位方法,克服现有内存泄漏定位技术的缺陷,提高内存泄漏定位精确度。为了实现上述技术目的,本专利技术的技术方案为:一种Web应用的内存泄漏定位方法,包括以下步骤:(1)对Web应用程序进行加载时插桩,注入信息收集探针,从而收集各类型对象的分配、释放信息;(2)执行测试脚本,驱动Web应用程序工作,对内执行Web应用的代码,对外提供Web功能服务;(3)跟踪Web应用的内存使用,并对内存使用信息进行时间维度过滤和空间维度过滤;(4)根据过滤后的内存使用信息,通过可疑对象的排序进行内存泄漏定位。进一步地,在步骤(1)中,通过编写JVM调试代理来实现插桩;Web容器启动时挂载了JVM调试代理,当每个类的class文件被加载时,均在该调试代理程序中触发一个事件回调,在该回调函数中,动态拦截并修改当前正在加载的类文件,实现插桩。进一步地,在步骤(3)中,所述时间维度过滤的方法为,将每次Web应用在测试脚本驱动下的完整执行过程标记为一个时间阶段,并分配一个阶段编号,在对象分配时,为每个对象打上相应的阶段编号标记,当对象释放或读写时,系统读取其阶段编号标记,若对象的阶段编号与当前时间阶段的阶段编号不同,则说明该对象非当前测试阶段创建的对象,过滤掉该对象。进一步地,在步骤(3)中,所述空间维度过滤的方法为,每个对象均有一个创建上下文,即分配对象时所在的方法调用栈,用一串类方法的调用序列来标识,对于该序列中的每个类,找出其class文件所在位置,若class文件位于应用代码中,则说明该类为应用类,一个对象中包含有至少一个应用类,则该对象为应用对象,否则该对象为中间件系统对象,过滤掉中间件系统对象。进一步地,在步骤(4)中,将不同的对象类型按照其内存占用大小进行排序,并将占据内存最多的一组对象类型作为内存泄漏定位的结果。采用上述技术方案带来的有益效果:本专利技术充分考虑了Web应用程序的结构特征和使用特征,通过在泄漏定位过程中对内存对象进行时空维度过滤,达到提高内存泄漏定位精确度的目的。附图说明图1是本专利技术中加载时插桩示意图;图2是本专利技术中使用脚本驱动Web应用工作的示意图;图3是本专利技术中为对象添加阶段标记从而对其进行时间维度划分的示意图;图4是本专利技术中根据调用创建上下文区分对象的示意图;图5是本专利技术中内存泄漏定位示意图;图6是本专利技术的整体流程图。具体实施方式本专利技术适用于以Java、PHP、Python、JavaScript等语言实现的动态Web应用程序,为清晰说明本专利技术,下面以JavaWeb应用为例,结合附图来详细说明本专利技术的技术方案。1、第一阶段(Web应用加载时插桩)为收集对象分配信息,本专利技术对JavaWeb应用进行加载时插桩(load-timeinstrumentation)。插桩通过编写一个JVM调试代理(Agent)实现,如图1所示。该调试代理可以监控到各种内存使用事件。若Web容器启动时挂载了调试代理,则每个类的class文件被加载时,都会在调试代理程序中触发一个事件回调。在该回调函数中,可以动态拦截并修改当前正在加载的类文件,实现插桩。通过加载时插桩可避免事先修改Web应用的实现代码。本专利技术实现了一个插桩管理模块,该模块将在每一条对象分配语句(new语句)的出现位置之后,注入一个对探针方法的调用。在探针方法调用中,可完成对象分配信息的收集。2、第二阶段(使用脚本驱动Web应用工作)Web应用内存泄漏通常较为缓慢,需要反复执行某组Web操作。为降低对人工的依赖,本专利技术使用测试脚本来驱动Web应用工作。脚本驱动的Web应用内存泄漏定位如图2所示。本专利技术的内存泄漏定位模块将自动执行测试脚本,测试脚本启动一个浏览器,然后在浏览器中发起对Web服务器的远程调用。Web服务器由Web容器中间件和容器中的Web应用构成。容器负责维护其中Web应用的生命周期,而Web应用负责提供具体的功能服务。内存泄漏一般由于容器中Web应用的实现错误造成,容器本身的代码不太可能是造成内存泄漏的原因。3、第三阶段(内存使用跟踪)在测试脚本的驱动下,本专利技术将执行插桩后的Web应用代码。通过插桩注入的探针,可以跟踪对象的动态分配。探针模块可调用JVM虚拟机的调试接口,获知每一新分配对象占据的内存大小、对象分配语句所在的方法调用栈(即对象的创建上下文)、对象所属的实际类型等信息。本专利技术还将在编写的JVM调试代理模块中监听垃圾回收事件,从而能够跟踪到对象的释放。本专利技术在跟踪对象分配与释放的过程中将对对象进行时间和空间维度过滤,排除掉不太可能与内存泄漏相关的对象。a)时间维度的对象过滤Web应用程序部署在容器上后,可以被反复调用。在进行内存泄漏时,为准确分析,应该仅关注本轮测试涉及的对象,如此,可以排除历史干扰,将本轮测试执行的功能和程序的对象分配行为相关联,更好地对系统中存在的问题进行分析评判。为支持上述分析,本专利技术从时间维度对对象进行了划分。每轮测试执行被标记为一个时间阶段(phase),分配以一个阶段编号(phase本文档来自技高网...

【技术保护点】
一种Web应用的内存泄漏定位方法,其特征在于,包括以下步骤:(1)对Web应用程序进行加载时插桩,注入信息收集探针,从而收集各类型对象的分配、释放信息;(2)执行测试脚本,驱动Web应用程序工作,对内执行Web应用的代码,对外提供Web功能服务;(3)跟踪Web应用的内存使用,并对内存使用信息进行时间维度过滤和空间维度过滤;(4)根据过滤后的内存使用信息,通过可疑对象的排序进行内存泄漏定位。
【技术特征摘要】
1.一种Web应用的内存泄漏定位方法,其特征在于,包括以下步骤:(1)对Web应用程序进行加载时插桩,注入信息收集探针,从而收集各类型对象的分配、释放信息;(2)执行测试脚本,驱动Web应用程序工作,对内执行Web应用的代码,对外提供Web功能服务;(3)跟踪Web应用的内存使用,并对内存使用信息进行时间维度过滤和空间维度过滤;(4)根据过滤后的内存使用信息,通过可疑对象的排序进行内存泄漏定位。2.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(1)中,通过编写JVM调试代理来实现插桩;Web容器启动时挂载了JVM调试代理,当每个类的class文件被加载时,均在该调试代理程序中触发一个事件回调,在该回调函数中,动态拦截并修改当前正在加载的类文件,实现插桩。3.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(3)中,所述时间维度过滤的方法为,将每次Web应用在测试脚本驱动下...
【专利技术属性】
技术研发人员:钱巨,吴晗,周辉,
申请(专利权)人:南京航空航天大学,
类型:发明
国别省市:江苏,32
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。