一种利用Proxy对象进行web应用内存泄漏检测的方法

文档序号:35531731发布日期:2023-09-21 12:43阅读:47来源:国知局
一种利用Proxy对象进行web应用内存泄漏检测的方法

本发明涉及内存泄漏检测,更确切地说,它涉及一种利用proxy对象进行web应用内存泄漏检测的方法。


背景技术:

1、web应用程序现在已经越来越广泛地被使用,但是web应用引起的内存泄漏,一直是引起web应用系统性能下降的主要原因。web浏览器本身需占用大量用户内存,web应用内存泄露又会进一步增加内存消耗。当内存消耗达到一定程度时,浏览器将加快内存回收的频率以改善运行环境,但这又导致浏览器及web应用程序变慢,表现为程序变得卡顿。不仅如此,web应用程序还可能存在着因各种各样原因无法被浏览器回收的内存,随着无法回收的内存越积越多,web应用程序甚至是浏览器本身将会因内存耗尽而崩溃。因而解决内存泄露问题是提高web应用程序稳定性的重要的一环。

2、国内外内存检测算法主要有静态分析和动态分析两种。

3、静态分析是从源代码级分析泄露的成因,或者通过将程序堆中的对象图生成支配树,通过对支配树的分析找出泄露源,或者预先设定几种常见的javascript内存泄露模式,通过模式匹配找到内存泄露的成因,静态方法在适应性上较差,准确性和检出率较低。

4、动态分析是驱动程序运行,在运行中分析web应用内存前后的差值从而得到内存泄露的原因。现在普遍且有效的方法是:基于在现代网站中用户会经常反复回到相似视觉状态(如邮箱程序会经常回到邮箱的主界面)且用户两次访问相似的视觉状态会消耗大致相同的内存这一基本事实,将两次访问间的持续增长作为内存泄露指示器。但其仍无法避免需要编写驱动视觉状态的用例脚本,并且由于动态分析的算法的缺陷,需要多次驱动页面回到同一个视觉状态,但是从回到原始页面到检测分析,耗时过长。仅针对的一个页面(不含各种交互)的内存泄露检测就可能会长达5分钟,这对于一些多页应用来说是难以接受的。另一些改进方法,如基于脚本预测和重组的内存泄露测试加速技术,试图通过基于机器学习方法和脚本重组优化方法,预测得到更可能造成内存泄漏的功能测试脚本,检测到泄露点。但由于机器学习方法需要大量的用例数据集,应用的广泛性和训练后的实际准确率比较受限。

5、总体来说,动态分析受制于用例,只能在用例覆盖的代码检测出泄露。而静态分析不受制于用例,但其对于javascript这类动态语言不合适,其运行时间通常很长并且准确性不高。


技术实现思路

1、本发明的目的是针对现有技术的不足,提出了一种利用proxy对象进行web应用内存泄漏检测的方法。

2、第一方面,提供了一种利用proxy对象进行web应用内存泄漏检测的方法,包括:

3、s1、启动网络代理;

4、s2、根据用户配置启动浏览器;

5、s3、截获浏览器的请求,网络代理会将目标网页的javascript代码进行转译,返回浏览器;

6、s4、运行泄漏检测算法以找出泄漏点。

7、作为优选,s4包括:

8、s401、代码注入:注入全局辅助函数与全局变量;

9、s402、代码转译:对作用域进行转换,将作用域的转换成直接的对象形式,并将其维护在一个对象树上,这棵对象树的根节点即是全局作用域;

10、s403、对象增长标记:在每次状态迭代结束后从全局作用域出发遍历所有被代理对象,找到属性增长较快的对象,从而确认泄露点;

11、s404、堆栈跟踪生成:在运行额外循环时,网络代理根据泄露对象匹配当前赋值路径,如果匹配成功则捕获当前堆栈信息;

12、s405、输出:读取堆栈跟踪信息通过转译时生成文件源映射,找到原始代码行列,读取对应的评分信息,进行泄漏类型推断,输出最终结果。

13、作为优选,s401中,所述全局辅助函数用于新建对象代理、创建函数作用域、遍历全部对象、标记全局对象属性数、计算泄漏对象的属性条目的平均增长趋势和生成泄露报告函数;全局变量包括全局作用域对象、泄露信息对象和全局作用域原始属性对象。

14、作为优选,s4还包括:

15、泄露评价:遍历全局对象树,对那些被标记为增长对象的属性条目数量历史列表进行求值,从而获取属性条目平均增长趋势,并进行排名从而区分泄漏的重要程度。

16、作为优选,s4还包括:

17、泄露分析:从作用域的类别入手,在对象树的生成和维护过程中,每个对象的类型会被标记;如果全局对象发生泄漏则认为是全局缓存泄漏,如果函数内对象发生泄漏则认为是闭包泄漏。

18、作为优选,s2中,利用输入脚本驱动web页面进行状态转换;所述输入脚本构建了状态转换列表,状态转换列表由两部分组成:检查函数和控制语句,前者检查当前状态是否就绪,后者驱动页面进入循环列表的下一个状态;通过驱动状态转换列表,根据输入脚本提供的其它辅助参数多次驱动页面回到同一个页面状态。

19、作为优选,s401中,建立一个文件源映射,记录程序在代码注入前后的内存对应关系。

20、作为优选,s405中,输出的最终结果包含泄漏对象在对象树上的访问路径、泄漏的堆栈跟踪信息、泄漏类型信息、泄漏评分和泄漏相关源代码。

21、第二方面,提供了一种利用proxy对象进行web应用内存泄漏检测的装置,用于执行第一方面任一所述的利用proxy对象进行web应用内存泄漏检测的方法,包括:

22、第一启动模块,用于启动网络代理;

23、第二启动模块,用于根据用户配置启动浏览器;

24、截获模块,用于截获浏览器的请求,网络代理会将目标网页的javascript代码进行转译,返回浏览器;

25、检测模块,用于运行泄漏检测算法以找出泄漏点。

26、第三方面,提供了一种计算机存储介质,所述计算机存储介质内存储有计算机程序;所述计算机程序在计算机上运行时,使得计算机执行第一方面任一所述的利用proxy对象进行web应用内存泄漏检测的方法。

27、本发明的有益效果是:

28、1.本发明不是对运行中的内存堆分析,找到内存泄露点,而是对对象树进行分析,找到属性增长较快的对象,从而确认泄露点,极大地降低了内存堆分析开销,节省了时间,克服了常用动态分析方法耗时长的缺陷。以普通一页web页面(不含各种交互)为例,对对象树的分析在秒级单位就能完成。

29、2.本发明不是基于用例的方法,不需要设计特定的用例,更不需要用诸如机器学习算法去改进用例。

30、3.本发明对原始web应用程序影响小,应用程序可以实现实时检测或者自动巡检。



技术特征:

1.一种利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,包括:

2.根据权利要求1所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s4包括:

3.根据权利要求2所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s401中,所述全局辅助函数用于新建对象代理、创建函数作用域、遍历全部对象、标记全局对象属性数、计算泄漏对象的属性条目的平均增长趋势和生成泄露报告函数;全局变量包括全局作用域对象、泄露信息对象和全局作用域原始属性对象。

4.根据权利要求3所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s4还包括:

5.根据权利要求4所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s4还包括:

6.根据权利要求5所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s2中,利用输入脚本驱动web页面进行状态转换;所述输入脚本构建了状态转换列表,状态转换列表由两部分组成:检查函数和控制语句,前者检查当前状态是否就绪,后者驱动页面进入循环列表的下一个状态;通过驱动状态转换列表,根据输入脚本提供的其它辅助参数多次驱动页面回到同一个页面状态。

7.根据权利要求6所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s401中,建立一个文件源映射,记录程序在代码注入前后的内存对应关系。

8.根据权利要求7所述的利用proxy对象进行web应用内存泄漏检测的方法,其特征在于,s405中,输出的最终结果包含泄漏对象在对象树上的访问路径、泄漏的堆栈跟踪信息、泄漏类型信息、泄漏评分和泄漏相关源代码。

9.一种利用proxy对象进行web应用内存泄漏检测的装置,其特征在于,用于执行权利要求1至8任一所述的利用proxy对象进行web应用内存泄漏检测的方法,包括:

10.一种计算机存储介质,其特征在于,所述计算机存储介质内存储有计算机程序;所述计算机程序在计算机上运行时,使得计算机执行权利要求1至8任一所述的利用proxy对象进行web应用内存泄漏检测的方法。


技术总结
本发明涉及一种利用Proxy对象进行web应用内存泄漏检测的方法,包括启动网络代理;根据用户配置启动浏览器;截获浏览器的请求,网络代理会将目标网页的JavaScript代码进行转译,返回浏览器;运行泄漏检测算法以找出泄漏点。本发明的有益效果是:本发明不是对运行中的内存堆分析,找到内存泄露点,而是对对象树进行分析,找到属性增长较快的对象,从而确认泄露点,极大地降低了内存堆分析开销,节省了时间,克服了常用动态分析方法耗时长的缺陷。以普通一页web页面为例,对对象树的分析在秒级单位就能完成。

技术研发人员:李飞,杨海波,郭鸣,丁雷鸣
受保护的技术使用者:浙大城市学院
技术研发日:
技术公布日:2024/1/15
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1