CN106991042A - 一种Web应用的内存泄漏定位方法 - Google Patents
一种Web应用的内存泄漏定位方法 Download PDFInfo
- Publication number
- CN106991042A CN106991042A CN201710130882.7A CN201710130882A CN106991042A CN 106991042 A CN106991042 A CN 106991042A CN 201710130882 A CN201710130882 A CN 201710130882A CN 106991042 A CN106991042 A CN 106991042A
- Authority
- CN
- China
- Prior art keywords
- web
- memory
- class
- memory overflow
- stage
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种Web应用的内存泄漏定位方法,该方法包括四个阶段:Web应用加载时插桩、使用脚本驱动Web应用工作、跟踪Web应用内存使用、可疑对象排序得到内存泄漏定位结果。本发明充分考虑了Web应用程序的结构特征和使用特征,通过在泄漏定位过程中对内存对象进行时空维度过滤,达到提高内存泄漏定位精确度的目的。
Description
技术领域
本发明属于计算机软件开发领域,特别涉及了一种Web应用的内存泄漏定位方法。
背景技术
Web应用是一类典型的容易包含内存泄漏问题的应用程序。其对外提供长期的服务,即使每次被调用仅泄漏微小的内存,Web应用也可能在外部用户的长时间使用下,损失大量内存,造成严重后果。内存泄漏可导致Web应用程序宕机,无法继续对外提供功能服务,带来经济和社会效益损失。
为解决内存泄漏问题,提高性能表现,改善系统可用性,必须对内存泄漏问题的诊断定位技术进行研究,以排除泄漏。在此方面,人们已对一般应用程序上的内存泄漏诊断定位技术进行了许多研究,取得了不少重要研究成果,也研发了多种相关工具,例如EJTechnique公司的JProfiler、IBM公司的Application Developer、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应用程序,为清晰说明本发明,下面以Java Web应用为例,结合附图来详细说明本发明的技术方案。
1、第一阶段(Web应用加载时插桩)
为收集对象分配信息,本发明对Java Web应用进行加载时插桩(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 ID)。在对象分配时,为每个对象打上一个阶段编号标记。如此,可以利用阶段信息,有效排除非当前测试阶段创建的对象,提高内存泄漏定位准确性。特别是许多类型的对象仅在Web应用首次测试执行时创建,在后续的反复测试中,都不会再进行分配。这些对象可能占用可观规模的内存,但它们的内存占用相对稳定,不太可能是泄漏源。过滤掉这些对象,可以缩小可疑泄漏源的范围,改进泄漏定位效果。
阶段信息的设定如图3所示。在每次执行测试脚本前,内存泄漏定位模块会向内存跟踪器发送一个新的阶段标记设定。对于一个阶段内创建的对象,阶段标记也将作为主要对象标记之一以tag标签形式被附加到对象上。当对象释放或读写时,系统将读取其阶段标记,如果一个对象的阶段标记与当前阶段号不同,则该对象的使用将不被更新到当前测试执行的相关信息表中。
b)空间维度的对象过滤
容器中间件对象和Web应用对象混在一起分析是影响内存泄漏定位效果的一个重要因素。为解决该问题,本发明从空间维度出发,对于内存中的各个类对象,基于创建上下文进行归类区分,识别为容器系统对象和应用对象,形成内存对象在空间层面的一个划分。如此,在最终诊断定位泄漏源时,可以将重点关注于比较可能造成泄漏的Web程序应用对象上,提高定位精度。
基于调用上下文的对象区分如图4所示。每个对象有一个创建上下文,用一串类方法的调用序列来标识。对序列中的每个类,可以找出其class文件所在的位置。根据Web应用的结构规范,应用代码存放在Web项目的特定目录下(如WEB-INF\classes子目录)。利用该信息,可以识别调用上下文中所有的应用类,这些类是Web应用开发者针对本应用的功能需求新编写的程序代码,而不是来自质量较为可靠的程序库。
若一个对象是应用对象,那么在其创建上下文序列中,至少应该有一个类是应用类;否则,该对象的整个创建过程与用户编写的Web应用代码无关,是中间件系统对象。Web中间件实现质量通常有良好的保证,系统对象不太可能造成泄漏。根据该特性,可以在内存跟踪时对系统对象进行过滤,仅保留应用对象的相关信息,如此可以排除掉一大部分动态跟踪的对象,从而能够大大缩小可疑泄漏源的规模。
4、第四阶段(内存泄漏定位)
本发明通过在执行完测试脚本后,对Web服务器端程序中不同的对象类型按照其内存占用大小进行排序来定位泄漏对象,如图5所示。一般来说,对一个Web应用而言,不太希望其某一轮执行会累积对象,产生内存方面的副作用。对于经过时空过滤后存活的当前测试脚本执行阶段新分配的应用对象,如果一个类型的对象占据的内存越多,其副作用越大,这组对象越可能是造成内存泄漏的根源。系统将会把排序后列在靠前位置的占据内存最多的一组对象类型汇报为泄漏原因,作为内存泄漏定位的结果。时空过滤越彻底,泄漏定位结果中不太可能造成泄漏的历史测试执行累积的对象、容器中间件系统对象等越少,其干扰越小,定位结果越准确。
综上所述,本发明通过四个阶段,即Web应用加载时插桩、使用脚本驱动Web应用工作、跟踪Web应用内存使用、可疑对象排序,来进行Web应用上的内存泄漏定位,整个过程如图6所示。通过在内存使用跟踪过程中进行时间和空间两个维度的对象过滤,达到了更好的Web应用内存泄漏定位效果。
表1显示了验证本发明优越性的数据集,每个实验对象中均包含一个类型的造成泄漏的对象。
表1
表2显示了使用基于时空维度过滤的Web应用内存泄漏定位方法前后,跟踪对象的种类数变化、以及真实造成泄漏的对象类型在定位结果中的排名变化。例如BookManager应用在定位后报告的跟踪对象种类数降低了94.39%,真正造成内存泄漏的对象类型在所有报告的对象类型中的排名提升了87.50%。排名提升意味着用户可以更快地从所有跟踪对象中找到泄漏源,从而进一步证明本发明可以显著提高内存泄漏定位的精确度。
表2
实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。
Claims (5)
1.一种Web应用的内存泄漏定位方法,其特征在于,包括以下步骤:
(1)对Web应用程序进行加载时插桩,注入信息收集探针,从而收集各类型对象的分配、释放信息;
(2)执行测试脚本,驱动Web应用程序工作,对内执行Web应用的代码,对外提供Web功能服务;
(3)跟踪Web应用的内存使用,并对内存使用信息进行时间维度过滤和空间维度过滤;
(4)根据过滤后的内存使用信息,通过可疑对象的排序进行内存泄漏定位。
2.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(1)中,通过编写JVM调试代理来实现插桩;Web容器启动时挂载了JVM调试代理,当每个类的class文件被加载时,均在该调试代理程序中触发一个事件回调,在该回调函数中,动态拦截并修改当前正在加载的类文件,实现插桩。
3.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(3)中,所述时间维度过滤的方法为,将每次Web应用在测试脚本驱动下的完整执行过程标记为一个时间阶段,并分配一个阶段编号,在对象分配时,为每个对象打上相应的阶段编号标记,当对象释放或读写时,系统读取其阶段编号标记,若对象的阶段编号与当前时间阶段的阶段编号不同,则说明该对象非当前测试阶段创建的对象,过滤掉该对象。
4.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(3)中,所述空间维度过滤的方法为,每个对象均有一个创建上下文,即分配对象时所在的方法调用栈,用一串类方法的调用序列来标识,对于该序列中的每个类,找出其class文件所在位置,若class文件位于应用代码中,则说明该类为应用类,一个对象中包含有至少一个应用类,则该对象为应用对象,否则该对象为中间件系统对象,过滤掉中间件系统对象。
5.根据权利要求1所述Web应用的内存泄漏定位方法,其特征在于:在步骤(4)中,将不同的对象类型按照其内存占用大小进行排序,并将占据内存最多的一组对象类型作为内存泄漏定位的结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710130882.7A CN106991042A (zh) | 2017-03-07 | 2017-03-07 | 一种Web应用的内存泄漏定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710130882.7A CN106991042A (zh) | 2017-03-07 | 2017-03-07 | 一种Web应用的内存泄漏定位方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106991042A true CN106991042A (zh) | 2017-07-28 |
Family
ID=59411648
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710130882.7A Pending CN106991042A (zh) | 2017-03-07 | 2017-03-07 | 一种Web应用的内存泄漏定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106991042A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107291598A (zh) * | 2017-08-07 | 2017-10-24 | 腾讯科技(深圳)有限公司 | 监控方法、监控装置、监控设备和存储介质 |
CN108182146A (zh) * | 2017-12-27 | 2018-06-19 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN109992968A (zh) * | 2019-03-25 | 2019-07-09 | 北京理工大学 | 基于二进制动态插桩的Android恶意行为动态检测方法 |
CN112732513A (zh) * | 2019-10-28 | 2021-04-30 | 腾讯科技(深圳)有限公司 | 内存监控方法、装置、计算机可读存储介质和计算机设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101639804A (zh) * | 2008-07-29 | 2010-02-03 | 国际商业机器公司 | 确定程序中的内存泄漏位置的方法和装置 |
CN103473172A (zh) * | 2013-09-05 | 2013-12-25 | 无敌科技(西安)有限公司 | 检查后台程序内存泄露并定位泄露内存点的系统及方法 |
CN105144112A (zh) * | 2013-04-11 | 2015-12-09 | 甲骨文国际公司 | Java堆使用的季节趋势、预报、异常检测和端点预测 |
CN105808369A (zh) * | 2016-03-29 | 2016-07-27 | 北京系统工程研究所 | 一种基于符号执行的内存泄漏检测方法 |
-
2017
- 2017-03-07 CN CN201710130882.7A patent/CN106991042A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101639804A (zh) * | 2008-07-29 | 2010-02-03 | 国际商业机器公司 | 确定程序中的内存泄漏位置的方法和装置 |
CN105144112A (zh) * | 2013-04-11 | 2015-12-09 | 甲骨文国际公司 | Java堆使用的季节趋势、预报、异常检测和端点预测 |
CN103473172A (zh) * | 2013-09-05 | 2013-12-25 | 无敌科技(西安)有限公司 | 检查后台程序内存泄露并定位泄露内存点的系统及方法 |
CN105808369A (zh) * | 2016-03-29 | 2016-07-27 | 北京系统工程研究所 | 一种基于符号执行的内存泄漏检测方法 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107291598A (zh) * | 2017-08-07 | 2017-10-24 | 腾讯科技(深圳)有限公司 | 监控方法、监控装置、监控设备和存储介质 |
CN107291598B (zh) * | 2017-08-07 | 2018-07-06 | 腾讯科技(深圳)有限公司 | 监控方法、监控装置、监控设备和存储介质 |
CN108182146A (zh) * | 2017-12-27 | 2018-06-19 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN108182146B (zh) * | 2017-12-27 | 2021-08-24 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN109992968A (zh) * | 2019-03-25 | 2019-07-09 | 北京理工大学 | 基于二进制动态插桩的Android恶意行为动态检测方法 |
CN112732513A (zh) * | 2019-10-28 | 2021-04-30 | 腾讯科技(深圳)有限公司 | 内存监控方法、装置、计算机可读存储介质和计算机设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Memon | Automatically repairing event sequence-based GUI test suites for regression testing | |
US9740506B2 (en) | Automating interactions with software user interfaces | |
US7734666B2 (en) | Method and system for inspecting memory leaks and analyzing contents of garbage collection files | |
Rothermel et al. | On test suite composition and cost-effective regression testing | |
Jin et al. | Automated behavioral regression testing | |
CN101339533B (zh) | 基于分区的诊断Java系统的内存泄漏的方法及装置 | |
CN111756575B (zh) | 存储服务器的性能分析方法及装置、电子设备 | |
US20120167054A1 (en) | Collecting Program Runtime Information | |
US9740586B2 (en) | Flexible configuration and control of a testing system | |
US7313661B1 (en) | Tool for identifying causes of memory leaks | |
CN106991042A (zh) | 一种Web应用的内存泄漏定位方法 | |
US8229979B2 (en) | Method and system for inspecting memory leaks | |
CN105912458A (zh) | 一种用于动态检测c/c++内存泄露的方法及系统 | |
CN102789416A (zh) | 面向bit软件测试的存储器故障注入方法及其模拟器 | |
CN106021103A (zh) | 一种基于代码变更的移动应用测试脚本自动维护方法 | |
US8793289B2 (en) | Method and system for detecting memory leaks and copying garbage collection files | |
US20170177272A1 (en) | Methods and systems for memory suspect detection | |
Shihab et al. | Prioritizing the creation of unit tests in legacy software systems | |
US8898644B2 (en) | Efficient unified tracing of kernel and user events with multi-mode stacking | |
CN103064780B (zh) | 一种软件测试的方法及装置 | |
US20080163009A1 (en) | Method and system for providing enhanced memory error messages | |
Saavedra et al. | GitBug-Actions: Building Reproducible Bug-Fix Benchmarks with GitHub Actions | |
CN112612697A (zh) | 一种基于字节码技术的软件缺陷测试定位方法及系统 | |
US9244814B1 (en) | Enriched log viewer | |
JP5592828B2 (ja) | パッチ影響解析装置、方法及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170728 |
|
RJ01 | Rejection of invention patent application after publication |