内存异常增长的检测系统及方法与流程

文档序号:11627679阅读:228来源:国知局
内存异常增长的检测系统及方法与流程

本发明涉及计算机系统技术领域,尤其涉及内存分配、管理和分析技术领域,具体是指一种内存异常增长的检测系统及方法。



背景技术:

内存异常增长包含内存泄露和非泄露性质的内存异常增长,当前主流的内存检测工具都偏向检测内存泄露的情形,一般内存泄露检测方法是,hook目标进程的内存管理函数,在目标进程生命周期结束的时候,若检测到目标进程有未释放的内存,则目标进程内存泄露。而对于无法结束其生命周期的进程,比较流行的一种检测方法是基于时间片轮询检查目标进程在两个时间点之间内存使用情况,进而找到内存泄露的怀疑点,然后再由程序员代码分析判断。但是,目前已知的工具,并没有特别针对非泄露的内存增长检测工具,而已知的内存检测工具存在以下不足:

1、对于系统级别进程,其生命周期与系统同步,依赖进程生命周期结束的工具,无法检测该类进程。

2、基于时间片检测内存泄露的工具,其时间片就是个经验值,无法应对任意场景的内存泄露,并且对于小内存泄露,无法准确侦测和排除噪点。

3、目前流行的工具都不能准确侦测非泄露性质的内存异常增长,比如短时间内申请大量内存,之后再释放,该场景依然会可能导致系统异常,但却事后从内存上无法发现问题,而且内存泄露工具也无法准确发现该异常。



技术实现要素:

本发明的目的是克服了上述现有技术的缺点,提供了一种能够解决特殊情况下出现的内存非泄露性异常增长的情况和系统级生命周期的进程内存泄露的问题,并实现检测内存异常增长的系统及方法。

为了实现上述目的,本发明具有如下构成:

该内存异常增长的检测系统,包括:

内存记录模块,用于注册钩子函数并记录所有已经申请的内存的元数据;

内存监控模块,用于监控目标进程的已使用内存,并在出现内存异常增长且熬过阈值时记录所述的内存记录模块所保存的元数据;

数据分析模块,用于分析内存监控模块的所有数据,将元数据转换成调试信息并生成可视化信息,显示内存异常增长的总大小和各个内存申请点所申请内存的大小和百分比。

还包括一种基于上述系统实现内存异常增长的检测方法,所述的方法包括以下步骤:

(1)在进程启动时通过所述的内存记录模块注册钩子函数;

(2)所述的内存记录模块对进程的内存申请和释放过程进行记录

(3)所述的内存监控模块对内存的使用情况进行监控,并在出现内存异常增长且熬过阈值时记录所述的内存记录模块所保存的元数据;

(4)所述的数据分析模块分析并生成可视化数据和调试信息。

较佳地,所述的步骤(2)包括以下步骤:

(3-1)应用发起内存申请的请求;

(3-2)通过所述的钩子函数记录内存元数据并保存到哈希表;

(3-3)向系统申请内存;

(3-4)检查内存占用是否超过阈值,如果是,则继续步骤(2-5),否则,完成本次内存申请的监控;

(3-5)通知内存监控模块记录当前进程的所有内存信息;

(3-6)更新当前进程的内存阈值。

更佳地,所述的更新当前进程的内存阈值,具体为:

基于最大占用内存或最小占用内存的稳步更新当前进程的内存阈值,或者基于最大占用内存或最小占用内存的梯度更新当前进程的内存阈值。

较佳地,所述的内存记录模块进程的内存释放过程进行记录并监控,具体包括以下步骤:

(3-7)进程申请内存释放;

(3-8)钩子函数检查当前释放的内存的元数据是否被记录,如果是,则删除元数据并继续步骤(3-9),否则,继续步骤(3-9);

(3-9)释放进程的内存。

较佳地,所述的步骤(3)包括以下步骤:

(4-1)根据内存监控模块获取的数据,通过比较任意两次内存申请的数据获得内存增加的元数据表;

(4-2)合并所述的元数据表并生成对应的调试信息,对信息进行排序;

(4-3)根据所述的调试信息生成可视化图标和调试信息表。

采用了该发明中的内存异常增长的检测系统及方法,实现了内存异常增长的检测和统计,基于钩子函数并不改动内存申请逻辑,可以在进程运行同时自由启动和关闭;可以检测到任意短时间内的内存突发性增长,对于内存非泄露性质的异常增长的检测效果显著;对于生命周期长的进程的内存泄露,该方案能较准确定位泄露位置并提供可靠的调试数据;通过分析任意一次内存增长前后的内存信息,可以获得内存增长点和图表统计数据;通过比对多个图表,在一定程度上排除噪点,增加判断内存异常位置的准确性。

附图说明

图1为本发明的内存异常增长的检测系统的示意图。

图2为本发明的内存异常增长的检测系统的数据交互的示意图。

图3为本发明的内存异常增长的检测方法的注册钩子函数的示意图。

图4为本发明的内存异常增长的检测方法的内存申请的示意图。

图5为本发明的内存异常增长的检测方法的内存释放的示意图。

具体实施方式

为了能够更清楚地描述本发明的技术内容,下面结合具体实施例来进行进一步的描述。

为了解决特殊情况下出现的内存非泄露性异常增长的情况和系统级生命周期的进程内存泄露的问题,并实现检测内存异常增长,本发明提出了一种内存异常增长的检测系统,请参阅图1所示,该系统包括三个模块:

一、内存记录模块,用于记录所有已经申请的内存的元数据信息,包括内存大小等。

1、基于钩子函数原理,在系统内存申请和释放的同时,记录下相关元数据信息,所谓的钩子函数,就是在正常的调用中插入一个函数或接口,而这个函数或接口可以继续后续的正常调用,也可以预先处理数据,或者直接返回,本发明里,钩子函数实现是预先处理数据,之后继续后续的正常调用。

二、内存监控模块,用于监控目标进程的已使用内存,并在出现内存异常增长并增长达到阈值记录下内存记录模块所保存的数据。

1、由于内存申请的钩子函数并不改动内存申请逻辑,所以该监控模块可以在进程运行时,随时启动和关闭。

2、基于内存增长阈值作为触发条件,该方案可以检测到任意短时间内的内存突发性增长,即使是在内存增长后立即释放。所以,对于内存非泄露性质的异常增长的检测,效果显著。

3、基于内存增长阈值作为触发条件,该方案可以检测与系统生命周期等长的进程内存泄露情况。但是,为了避免第2点的情况带来误差,建议是在进程内存稳定后开启检测,内存增长阈值至少为1m,并且多次抓取内存变化的数据。所以,对于生命周期长的进程的内存泄露,该方案能较准确定位泄露位置并提供可靠的调试数据。

三、数据分析模块,该模块用于分析内存监控模块所导出的所有数据,将所有之前抓取的元数据转换成相应调试信息并生成可视化信息,显示内存异常增长的总大小和各个内存申请点所申请内存的大小和百分比。

1、通过分析任意一次内存增长前后的内存信息,可以获得内存增长点和图表统计数据。

2、通过比对多个图表,在一定程度上排除噪点,增加判断内存异常位置的准确性。

在一种具体的实施方式中,该内存异常增长的检测系统,包括:

内存记录模块,用于注册钩子函数并记录所有已经申请的内存的元数据;

内存监控模块,用于监控目标进程的已使用内存,并在出现内存异常增长且熬过阈值时记录所述的内存记录模块所保存的元数据;

数据分析模块,用于分析内存监控模块的所有数据,将元数据转换成调试信息并生成可视化信息,显示内存异常增长的总大小和各个内存申请点所申请内存的大小和百分比。

以上三个模块的信息交互关系和数据流请参阅图2所示,这三个模块在完整的控制流程中的运作方式如下所述:

一、进程启动注册钩子函数,请参阅图3所示:

11、进程启动;

12、注册钩子函数。

二、内存监控模块监控进程内存使用

21、内存申请,请参阅图4所示:

211、应用申请内存,具体是指应用发起内存申请的请求,具体到代码层面是调用内存分配函数;

212、钩子函数记录内存元数据并保存到哈希表,在该方案中使用哈希表的原因是快,内存申请必须要快,最好是在添加“钩子函数”后,尽量不影响内存申请速度,否则可能会造成应用运行异常(比如时序改变,交互响应变慢等),所以,任何足够快的数据结构或者算法,都可以替换掉哈希表的实现;

213、向系统申请内存,具体是指向底层的内存池(如果基础库实现了内存池功能)或者向内核申请内存(如果基础库未实现内存池功能),其中,基础库是指进程运行所必须的库,比如libc等库,在申请完内存后,进程就可以占用和使用相应的内存;

214、检查内存占用是否达到阈值;

215、如果内存达到阈值,则通知内存监控模块记录当前进程内存所有信息,并更新内存阈值,本方案的功能是抓取应用内存的异常增长,而内存的涨跌是最不可预测的,应用可以在某个时间申请很大内存,用完立即释放,更新内存阈值,就可以多次基于不同的阈值情况下抓取相应的数据,数据分析模块可以基于这些数据分析出该单次内存的申请,也可以从统计的信息中,分析出该次内存被正常释放了;更新阈值的方法涉及到具体的实现,可根据需求实现不同的方法,目前有的实现方法是:1、基于最大占用内存(或最小占用内存)的稳步更新,比如说,设定内存增长步长为1m,则每次阈值更新都是基于当前内存占用的基础上增加1m,该实现适用于开发人员了解该应用的内存增长情况;2、基于最大占用内存(或最小占用内存)的梯度更新,比如说,设定内存增长基础步长为1m,则每次更新阈值在当前步长的基础上增加一定的值,比如下次步长变成2m,再下次4m,该实现方法适用于开发人员不清楚应用的内存增长情况。

22、内存释放,请参阅图5所示:

221、钩子函数检查当前释放内存是否被记录;

222、如果记录,则从哈希表中删除相关数据,本方案的目的是检测内存异常增长,而异常增长的原因就是只有内存申请,未有内存释放,而数据分析模块是要分析并生成所有只申请内存未释放的数据并转换成可视化信息,所以,在有内存释放的时候,代表这块被释放的内存不属于异常增长点,就要删除相应的元数据记录,避免被统计到最后的调试信息和可视化信息中;

223、释放内存,即将内存返回给内存池或者是内核,需要注意的是释放内存并不是关闭应用,而是应用发起的跟申请内存相对应的行为。

三、数据分析模块分析并生成可视化数据和调试信息

31、基于内存监控模块获取的数据,任意两次之间进行比较获得内存增加的元数据表;

32、基于步骤31生成的表进一步合并和生成对应的调试信息,并基于内存增长的从大到小排序;

33、基于步骤32生成可视化图标和调试信息表,用于开发人员的分析和快速定位。

在一种具体的实施方式中,本发明还包括一种基于上述系统实现内存异常增长的检测方法,所述的方法包括以下步骤:

(1)在进程启动时通过所述的内存记录模块注册钩子函数;

(2)所述的内存记录模块对进程的内存申请和释放过程进行记录

(3)所述的内存监控模块对内存的使用情况进行监控,并在出现内存异常增长且熬过阈值时记录所述的内存记录模块所保存的元数据;

(4)所述的数据分析模块分析并生成可视化数据和调试信息。

在一种较佳的实施方式中,所述的步骤(2)包括以下步骤:

(3-1)应用发起内存申请的请求;

(3-2)通过所述的钩子函数记录内存元数据并保存到哈希表;

(3-3)向系统申请内存;

(3-4)检查内存占用是否超过阈值,如果是,则继续步骤(2-5),否则,完成本次内存申请的监控;

(3-5)通知内存监控模块记录当前进程的所有内存信息;

(3-6)更新当前进程的内存阈值。

在一种更佳的实施方式中,所述的更新当前进程的内存阈值,具体为:

基于最大占用内存或最小占用内存的稳步更新当前进程的内存阈值,或者基于最大占用内存或最小占用内存的梯度更新当前进程的内存阈值。

在一种较佳的实施方式中,所述的内存记录模块进程的内存释放过程进行记录并监控,具体包括以下步骤:

(3-7)进程申请内存释放;

(3-8)钩子函数检查当前释放的内存的元数据是否被记录,如果是,则删除元数据并继续步骤(3-9),否则,继续步骤(3-9);

(3-9)释放进程的内存。

在一种较佳的实施方式中,所述的步骤(3)包括以下步骤:

(4-1)根据内存监控模块获取的数据,通过比较任意两次内存申请的数据获得内存增加的元数据表;

(4-2)合并所述的元数据表并生成对应的调试信息,对信息进行排序;

(4-3)根据所述的调试信息生成可视化图标和调试信息表。

在具体实现中,钩子函数的内容就是内存记录模块,内存元数据的核心内容有:内存申请调用的堆栈信息和当前申请的内存大小,钩子函数将该这些信息获取,以堆栈和请求的内存大小为依据在哈希表中查找,若对象已存在,则增加内存申请的次数,以表示该堆栈该大小的内存再次被申请了,而哈希表属于全局变量,可以被内存记录模块和内存监控模块共同所访问。

采用了该发明中的内存异常增长的检测系统及方法,实现了内存异常增长的检测和统计,基于钩子函数并不改动内存申请逻辑,可以在进程运行同时自由启动和关闭;可以检测到任意短时间内的内存突发性增长,对于内存非泄露性质的异常增长的检测效果显著;对于生命周期长的进程的内存泄露,该方案能较准确定位泄露位置并提供可靠的调试数据;通过分析任意一次内存增长前后的内存信息,可以获得内存增长点和图表统计数据;通过比对多个图表,在一定程度上排除噪点,增加判断内存异常位置的准确性。

在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1