一种内存泄漏检测方法、装置及设备与流程

专利2022-06-30  84


本申请涉及计算机领域,尤其涉及一种内存泄漏检测方法、装置及设备。



背景技术:

内存(memory)是计算机中的重要部件之一,用于存储计算机的应用程序临时产生的数据,当应用程序结束运行之后,存储该应用程序临时数据的相关内存通常应当被释放。如果由于内存泄露(memoryleak)等原因导致内存出现没有被释放或释放缓慢的故障,则可能会导致其他应用程序内存申请失败,从而影响业务的正常运行。所以,内存泄漏检测的及时性非常关键。

传统检测内存泄漏的方法是判断某个应用程序占用内存的时间或大小是否超过某个阈值,如果超过,则认为内存发生没有被释放或释放缓慢的故障。然而,若该应用程序占用内存的时间较长或占用内存较大是正常业务需求,则有可能会导致误判。



技术实现要素:

本申请实施例提供了一种内存泄漏检测方法、装置及设备,用于提高内存泄露检测的准确性。

第一方面,本申请实施例提供了一种内存泄漏检测方法,应用于设备,设备可以是路由器、交换机、软件定义网络(softwaredefinednetwork,sdn)控制器或网关设备等。方法包括:首先,设备对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将n个样本按照采样顺序进行排列,其中m大于或等于n,n为大于1的正整数。其次,设备根据n个样本中相邻两个样本之间的差值,确定内存的总大小的增长次数。相邻两个样本之间的差值是指相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值。当增长次数大于或等于第一阈值时,设备确认内存发生泄漏。第一阈值应当为较大的一个数值,例如大于样本总数的二分之一。第一阈值可以随着样本总数的变化而呈正相关变化。

相比于传统根据内存占用时间长短的方法判断是否发生内存泄露的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用时间较长,如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

相比于传统根据内存占用大小判断是否发生泄漏的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用较大,但如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

在实际应用中,内存在正常运行时,大小可能会随着时间而有微小的起伏变化,比如几十千字节或几百千字节。为了在确认是否发生内存泄露时排除这种正常的变化,使得内存泄露的检测更加的准确和可靠,可选的,相邻两个样本可以包括第一样本和第二样本,第一样本为采样时间较晚的样本,第二样本为采样时间较早的样本。设备根据n个样本中相邻两个样本之间的差值,确定内存的大小的增长次数包括:当第一样本和第二样本之间的差值大于或等于第二阈值时,设备确认内存的大小增长一次。

可选的,获取应用程序所占用内存总大小的方式可以是,设备获取应用程序的内存申请请求,并根据内存申请请求中携带的待申请内存的内存大小累计应用程序占用的内存的总大小。

可选的,内存申请请求中还携带有句柄标识(handleid),句柄标识可以是整数。一个应用程序的内存业务申请流程与一个句柄标识与对应,句柄标识用于标识内存业务申请流程。根据内存申请请求中携带的待申请内存的内存大小累计应用程序占用的内存的总大小包括:根据内存申请请求中携带的句柄标识和待申请内存的内存大小,累计与句柄标识对应的应用程序占用的内存的总大小。也就是说,在累计应用程序占用内存的总大小时,可以根据句柄标识进行累计。

内存占用总大小不仅可能因为内存申请而增加,也可能会因为内存释放减少。可选的,方法还包括:设备获取应用程序的内存释放请求,根据内存释放请求中携带的待释放内存的地址确认待释放内存的大小;设备根据待释放内存的大小更新应用程序占用的内存的总大小。

可选的,内存释放请求中还携带有句柄标识,根据待释放内存的大小更新应用程序占用的内存的总大小包括:根据内存释放请求中携带的句柄标识和待释放内存的大小,更新应用程序占用的内存总大小。

作为一种可能的实现方式,为了能够及时发现内存是否泄露,设备对应用程序占用的内存的总大小进行m次采样,得到n个样本包括:设备设置n个数组,对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中,其中,当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中;当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。

可选的,根据n个样本中相邻两个样本之间的差值,确定内存的总大小的增长次数包括:令mic=0,i=0;计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1;判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤;其中,mic为内存增长次数,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余;

当增长次数大于或等于第一阈值时,确认内存发生泄漏包括:当mic大于或等于第一阈值时,确认内存发生泄漏。

第二方面,本申请实施例提供了一种内存泄露检测装置,应用于设备,装置包括:采样单元,用于对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将n个样本按照采样顺序进行排列,其中m大于或等于n,n为大于1的正整数;计算单元,用于根据n个样本中相邻两个样本之间的差值,确定内存的总大小的增长次数,相邻两个样本之间的差值是指相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值;检测单元,用于当增长次数大于或等于第一阈值时,确认内存发生泄漏。

可选的,相邻两个样本包括第一样本和第二样本,第一样本为采样时间较晚的样本,第二样本为采样时间较早的样本;

确定单元,用于当第一样本和第二样本之间的差值大于或等于第二阈值时,确认内存的大小增长一次。

可选的,装置还包括:获取单元,用于获取应用程序的内存申请请求;累计单元,用于根据内存申请请求中携带的待申请内存的内存大小累计应用程序占用的内存的总大小。

可选的,内存申请请求中还携带有句柄标识,累计单元,用于根据内存申请请求中携带的句柄标识和待申请内存的内存大小,累计与句柄标识对应的应用程序占用的内存的总大小。

可选的,装置还包括:确定单元,用于获取应用程序的内存释放请求,根据内存释放请求中携带的待释放内存的地址确认待释放内存的大小;更新单元,用于设备根据待释放内存的大小更新应用程序占用的内存的总大小。

可选的,内存释放请求中还携带有句柄标识;

更新单元,用于根据内存释放请求中携带的句柄标识和待释放内存的大小,更新应用程序占用的内存总大小。

可选的,采样单元,用于设置n个数组,对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中,其中,当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中;当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。

可选的,计算单元,用于令mic=0,i=0;计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1;判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤;其中,mic为内存增长次数,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余;

检测单元,用于当mic大于或等于第一阈值时,确认内存发生泄漏。

第三方面,本申请实施例还提供了一种内存泄露检测设备,设备包括存储器和处理器,

存储器,用于存储指令;

处理器,用于执行存储器中的指令,执行上述内存泄漏检测方法。

第四方面,本申请实施例还提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行上述内存泄漏检测方法。

附图说明

图1为本申请实施例提供的一种内存泄漏检测方法的流程图;

图2为本申请实施例提供的一种内存泄漏检测装置的结构框图;

图3为本申请实施例提供的一种内存泄漏检测设备的硬件架构图。

具体实施方式

内存泄露是指由于应用程序运行逻辑发生错误而导致不再使用的内存没有被释放,或者由于应用程序处理性能较差的问题导致内存没有及时被释放,而导致占用内存不断积压的问题。如果内存持续泄露,则会导致其他应用程序内存申请失败,从而影响业务的正常运行。

传统判断内存是否泄露的方式是通过判断应用程序占用内存的时间是否超过某个阈值,或者占用内存的大小是否超过某个阈值,如果是,则认为内存出现泄露故障;如果不是,则认为内存没有出现泄露故障。

但是这种判断方式对于一些需要占用内存较长时间或者占用内存较多的正常业务而言,会出现误判的情况。

为了克服上述技术问题,本申请实施例提供了一种内存泄漏检测方法、装置及设备,提高检测内存泄漏的准确性和可靠性。

下面结合附图对本申请实施例提供的技术方案进行详细介绍。

参见图1,该图为本申请实施例提供的内存泄漏检测方法的流程图。

本申请实施例提供的内存泄漏检测方法可以由设备执行,设备可以是路由器、交换机、sdn控制器或网管设备等。

该方法具体包括如下步骤:

s101:设备对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将n个样本按照采样顺序进行排列。

在本申请实施例中,应用程序可以是指实现某个功能的功能模块,例如边界网关协议(bordergatewayprotocol,bgp)模块,该模块用于实现支持bgp协议的功能,或者该应用程序为用户终端上安装的应用(app),如微信等。若设备为路由器或交换机等设备,则应用程序可以安装在本设备中,即设备对安装在本设备上的应用程序所占用的内存进行内存泄露检测;若设备为sdn控制器或网管设备,则应用程序可以安装在其他设备中,即设备对其他安装了应用程序的设备进行内存泄露检测。

为了检测应用程序的内存是否泄露,本申请实施例首先对应用程序占用内存的总大小进行m次采样,得到n个样本,其中m大于或等于n,n为大于1的正整数,也就是说,样本的数目为多个。而为了得到n个样本,需要至少采样n次。

在一个示例中,获取应用程序所占用内存总大小的方式,可以通过获取应用程序的内存申请请求,并根据内存申请请求中携带的待申请内存的内存大小累计应用程序占用的内存的总大小。

例如,应用程序a在一次运行期间一共发起了三次内存申请请求,即第一内存申请请求、第二内存申请请求和第三内存申请请求。其中,第一内存申请请求中携带的待申请内存的内存大小为10兆(m),第二内存申请请求中携带的待申请内存的内存大小为100兆,第三内存申请请求中携带的待申请内存的内存大小为50兆。所以,应用程序a在该次运行期间占用的内存的总大小为160兆。

可选的,内存申请请求中可以携带应用程序的句柄标识,句柄标识可以是整数。一个应用程序的内存业务申请流程与一个句柄标识与对应,句柄标识用于标识内存业务申请流程。例如对于bgp模块,申请路由的业务流程对应一个句柄标识,接收报文的业务流程对应另一个句柄标识。这样,在累计应用程序占用内存的总大小时,可以根据句柄标识进行累计。

例如,设备获取到四个内存申请请求,即内存申请请求1、内存申请请求2、内存申请请求3和内存申请请求4。其中内存申请请求1中携带的句柄标识为1、待申请内存的内存大小为10兆。内存申请请求2中携带的句柄标识为2、待申请内存的内存大小为20兆。内存申请请求3中携带的句柄标识为1、待申请内存的内存大小为30兆。内存申请请求4中携带的句柄标识为2、待申请内存的内存大小为40兆。所以,可以得出,这四个内存申请请求来自于两个应用程序内存业务申请流程,即与句柄标识1对应的内存业务申请流程和与句柄标识2对应的内存业务申请流程。与句柄标识1对应的内存业务申请流程累计得到的内存总大小为40兆,与句柄标识2对应的内存业务申请流程累计得到的内存总大小为60兆。

当然,如果内存被释放的话,与句柄标识对应的内存总大小就相应的需要发生变化。具体的,设备获取应用程序的内存释放请求,内存释放请求中包括句柄标识和待释放内存的内存地址。根据待释放内存的内存地址可以确定待释放内存的大小,然后将与句柄标识对应的内存总大小减去待释放内存的大小,得到新的内存占用总大小。

例如,与句柄标识1对应的累计内存总大小为100兆,根据与句柄标识1对应的待释放内存请求中待释放内存的内存地址得到的待释放内存的大小为30兆,所以得到与句柄标识1对应的新的内存占用总大小为70兆。

由此可见,与句柄标识对应的内存总大小在不同的时间可能有不同的变化,有可能在某个时间点增长,也有可能在另外一个时间点减少。所以可以按照时间的先后顺序对应用程序占用的内存的总大小进行采样,并将得到的n个样本按照采样顺序进行排列,以掌握n个样本的内存总大小的变化情况。

在一个示例中,应用程序在申请内存以后,设备会记录应用程序申请的内存的总大小。因此,获取应用程序所占用内存总大小的方式可以通过应用程序对应的句柄标识从设备内存申请记录中获得该应用程序申请内存的总大小。

s102:设备根据n个样本中相邻两个样本之间的差值,确定内存的总大小的增长次数。

本申请实施例中,在对n个样本按照采样顺序进行排列之后,根据n个样本中相邻两个样本之间的差值,确定应用程序的内存的总大小的增长次数。其中,相邻两个样本之间的差值是指相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值。

举个例子,在一个小时之内,每5分钟对某应用程序内存的总大小进行一次采样,一共采样12次。按照采样时间由早到晚的顺序,这12次采样得到的应用程序的内存总大小分别为:10兆、20兆、25兆、40兆、42兆、40兆、46兆、50兆、48兆、52兆、55兆和60兆。第n 1次内存总大小的采样时间晚于第n次内存总大小的采样时间,0≤n<n,所以根据第n 1次采样的内存总大小与第n次采样的内存总大小的差值,确定内存总大小的增长次数为9次。

在实际应用中,内存在正常运行时,大小可能会随着时间而有微小的起伏变化,比如几十千字节(kb)或几百千字节。为了在确认是否发生内存泄露时排除这种正常的变化,使得内存泄露的检测更加的准确和可靠,可选的,可以将相邻两个样本中采样时间较晚的样本作为第一样本,采样时间较早的样本作为第二样本,计算第一样本和第二样本之间的差值,如果第一样本和第二样本之间的差值大于或等于第二阈值时,确认内存的大小增长一次。

以上个例子为例,假设第二阈值为0.5兆,在上述9组相邻的采样时间较晚的第一样本大于采样时间较早的第二样本中,二者之差全部都大于0.5兆,所以确认内存总大小的增长次数为9次。

s103:当增长次数大于或等于第一阈值时,设备确认内存发生泄漏。

在本申请实施例中,第一阈值应当为较大的一个数值,例如大于样本总数的二分之一。第一阈值可以随着样本总数的变化而呈正相关变化。

当增长次数大于或等于第一阈值,说明应用程序占用的内存的大小基本处于不断增加的状态,符合内存泄露的规律,所以认为内存发生泄漏。

例如,在上述例子中,对内存大小采样12次,增长次数为9次,若第一阈值为8次,那么由于增长次数大于第一阈值,所以认为该应用程序的内存发生泄漏。

而如果增长次数小于第一阈值,说明应用程序的内存被正常使用,所以不会被认为是内存泄露。

相比于传统根据内存占用时间长短的方法判断是否发生内存泄露的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用时间较长,如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

相比于传统根据内存占用大小判断是否发生泄漏的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用较大,但如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

此外,为了能够及时发现内存是否泄露,可以进行“滚动”采样,即从第一次采样开始,当采样到第n个样本时,根据第一次采样到第n次采样得到的n个样本执行s102和s103。然后当进行第n 1次采样之后,根据第2次采样到第n 1次采样的n个样本再次执行s102和s103。

具体的,设置n个数组,每个数组用于存储一个样本。n个数组中第一个数组的编号可以为1,第n个数组的编号可以为n。

对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中。当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中。例如,第一次采样得到的样本存入编号为0的数组,第二次采样得到的样本存入编号为1的数组,以此类推。或者,将第一次采样得到的样本存入编号为n-1的数组,第二次采样得到的样本存入编号为n-2的数组,以此类推。为了描述简单,下面都以前一种在数组中存样本的方式进行介绍。

当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。例如,假设n为15,那么可以将第16次采样得到的样本存入编号为1的数组中,并覆盖编号为1的数组中原来存储的第1次采样得到的样本;将第17次采样得到的样本存入编号为2的数组中,并覆盖编号为2的数组中原来存储的第2次采样得到的样本,以此类推。

当构建了n个数组之后,可以执行如下步骤:

令mic=0,i=0;

计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1。

判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤。

其中,mic为内存增长次数,i为序号,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余。

一旦mic大于或等于第一阈值,则可以进行告警,以通知工作人员内存发生泄漏。

其中,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长可以是:判断sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差是否大于或等于第二阈值,若是,则确认内存总大小增长,即令mic=mic 1。

此外,在实际应用中,每个handleid可以对应一个或多个调用栈。调用栈指示了业务流程的各个函数之间的调用关系。例如,调用栈表示为funca-->funcb->funcc->malloc,它的意思是函数a调用了函数b,函数b调用了函数c,函数c申请内存。

若某个handleid对应的内存发生泄漏,则可以根据对应的调用栈确认是哪个或哪些函数出了逻辑故障。例如对于上个例子而言,可以确认在函数a、函数b和函数c中,至少有一个函数的逻辑出现了问题。从而可以快速的从众多函数中定位出问题的函数。

同理,一个handleid可以与一个组件(component)标识或一个子组件标识对应,组件标识是指标识组件的id,子组件标识是指标识子组件的id,一个组件可以包括一个或多个子组件。当某个handleid对应的内存发生泄漏,则可以根据handleid与组件id或子组件id的对应关系,快速的从众多组件或子组件中定位出现问题的组件或子组件。

参见图2,本申请实施例提供了一种内存泄露检测装置,应用于设备,该设备可以实现图1所示实施例中设备的功能。该装置包括:采样单元201、计算单元202和检测单元203。其中,采样单元201用于执行图1所示实施例中的s101,计算单元202用于执行图1所示实施例中的s102,检测单元203用于执行图1所示实施例中的s103。具体的,

采样单元201,用于对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将n个样本按照采样顺序进行排列,其中m大于或等于n,n为大于1的正整数;

计算单元202,用于根据n个样本中相邻两个样本之间的差值,确定内存的总大小的增长次数,相邻两个样本之间的差值是指相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值;

检测单元203,用于当增长次数大于或等于第一阈值时,确认内存发生泄漏。

相比于传统根据内存占用时间长短的方法判断是否发生内存泄露的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用时间较长,如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

相比于传统根据内存占用大小判断是否发生泄漏的方式,本申请实施例通过判断内存总大小的增长次数是否大于第一阈值的方式来确认是否发生内存泄漏,即便内存占用较大,但如果增长次数较低,小于第一阈值,则认为内存是正常运行,没有发生泄漏,符合内存正常运行的规律,所以能够减少误判的概率。

可选的,相邻两个样本包括第一样本和第二样本,第一样本为采样时间较晚的样本,第二样本为采样时间较早的样本;

确定单元,用于当第一样本和第二样本之间的差值大于或等于第二阈值时,确认内存的大小增长一次。

可选的,装置还包括:获取单元,用于获取应用程序的内存申请请求;累计单元,用于根据内存申请请求中携带的待申请内存的内存大小累计应用程序占用的内存的总大小。

可选的,内存申请请求中还携带有句柄标识,累计单元,用于根据内存申请请求中携带的句柄标识和待申请内存的内存大小,累计与句柄标识对应的应用程序占用的内存的总大小。

可选的,装置还包括:确定单元,用于获取应用程序的内存释放请求,根据内存释放请求中携带的待释放内存的地址确认待释放内存的大小;更新单元,用于设备根据待释放内存的大小更新应用程序占用的内存的总大小。

可选的,内存释放请求中还携带有句柄标识;

更新单元,用于根据内存释放请求中携带的句柄标识和待释放内存的大小,更新应用程序占用的内存总大小。

可选的,采样单元,用于设置n个数组,对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中,其中,当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中;当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。

可选的,计算单元,用于令mic=0,i=0;计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1;判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤;其中,mic为内存增长次数,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余;

检测单元,用于当mic大于或等于第一阈值时,确认内存发生泄漏。

参见图3,本申请实施例还提供了一种内存泄露检测设备300,设备300可以实现图1所示实施例中设备的功能,该设备包括存储器301和处理器302,

存储器301,用于存储指令;

处理器302,用于执行存储器301中的指令,执行上述应用于图1所示实施例中设备的内存泄漏检测方法。

存储器301和处理器302通过总线203相互连接;总线203可以是外设部件互连标准(peripheralcomponentinterconnect,简称pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,简称eisa)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图3中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

上述存储器301可以是随机存取存储器(random-accessmemory,ram)、闪存(flash)、只读存储器(readonlymemory,rom)、可擦写可编程只读存储器(erasableprogrammablereadonlymemory,eprom)、电可擦除可编程只读存储器(electricallyerasableprogrammablereadonlymemory,eeprom)、寄存器(register)、硬盘、移动硬盘、cd-rom或者本领域技术人员知晓的任何其他形式的存储介质。

上述处理器302例如可以是中央处理器(centralprocessingunit,cpu)、通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(application-specificintegratedcircuit,asic)、现场可编程门阵列(fieldprogrammablegatearray,fpga)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等等。

本申请实施例还提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行上述应用于设备的内存泄漏检测方法。

本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理器中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已。

以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。


技术特征:

1.一种内存泄漏检测方法,其特征在于,所述方法包括:

设备对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将所述n个样本按照采样顺序进行排列,其中所述m大于或等于n,所述n为大于1的正整数;

所述设备根据所述n个样本中相邻两个样本之间的差值,确定所述内存的总大小的增长次数,所述相邻两个样本之间的差值是指所述相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值;

当所述增长次数大于或等于第一阈值时,所述设备确认所述内存发生泄漏。

2.根据权利要求1所述的方法,其特征在于,所述相邻两个样本包括第一样本和第二样本,所述第一样本为采样时间较晚的样本,第二样本为采样时间较早的样本;

所述设备根据所述n个样本中相邻两个样本之间的差值,确定所述内存的大小的增长次数包括:

当所述第一样本和第二样本之间的差值大于或等于第二阈值时,所述设备确认所述内存的大小增长一次。

3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:

所述设备获取所述应用程序的内存申请请求,并根据所述内存申请请求中携带的待申请内存的内存大小累计所述应用程序占用的内存的总大小。

4.根据权利要求3所述的方法,其特征在于,所述内存申请请求中还携带有句柄标识,所述根据所述内存申请请求中携带的待申请内存的内存大小累计所述应用程序占用的内存的总大小包括:

根据所述内存申请请求中携带的句柄标识和待申请内存的内存大小,累计与所述句柄标识对应的所述应用程序占用的内存的总大小。

5.根据权利要求3或4所述的方法,其特征在于,所述方法还包括:

所述设备获取所述应用程序的内存释放请求,根据所述内存释放请求中携带的待释放内存的地址确认所述待释放内存的大小;

所述设备根据所述待释放内存的大小更新所述应用程序占用的内存的总大小。

6.根据权利要求5所述的方法,其特征在于,所述内存释放请求中还携带有句柄标识,所述根据所述待释放内存的大小更新所述应用程序占用的内存的总大小包括:

根据所述内存释放请求中携带的句柄标识和所述待释放内存的大小,更新所述应用程序占用的内存总大小。

7.根据权利要求1-6任一项所述的方法,其特征在于,所述设备对应用程序占用的内存的总大小进行m次采样,得到n个样本包括:

所述设备设置n个数组,对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中,其中,当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中;当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。

8.根据权利要求7所述的方法,其特征在于,所述根据所述n个样本中相邻两个样本之间的差值,确定所述内存的总大小的增长次数包括:

令mic=0,i=0;

计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1;

判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤;

其中,mic为内存增长次数,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余;

当所述增长次数大于或等于第一阈值时,确认所述内存发生泄漏包括:

当所述mic大于或等于第一阈值时,确认所述内存发生泄漏。

9.一种内存泄露检测装置,其特征在于,应用于设备,所述装置包括:

采样单元,用于对应用程序占用的内存的总大小进行m次采样,得到n个样本,并将所述n个样本按照采样顺序进行排列,其中所述m大于或等于n,所述n为大于1的正整数;

计算单元,用于根据所述n个样本中相邻两个样本之间的差值,确定所述内存的总大小的增长次数,所述相邻两个样本之间的差值是指所述相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值;

检测单元,用于当所述增长次数大于或等于第一阈值时,确认所述内存发生泄漏。

10.根据权利要求9所述的装置,其特征在于,所述相邻两个样本包括第一样本和第二样本,所述第一样本为采样时间较晚的样本,第二样本为采样时间较早的样本;

所述确定单元,用于当所述第一样本和第二样本之间的差值大于或等于第二阈值时,确认所述内存的大小增长一次。

11.根据权利要求9或10所述的装置,其特征在于,所述装置还包括:

获取单元,用于获取所述应用程序的内存申请请求;

累计单元,用于根据所述内存申请请求中携带的待申请内存的内存大小累计所述应用程序占用的内存的总大小。

12.根据权利要求11所述的装置,其特征在于,所述内存申请请求中还携带有句柄标识,所述累计单元,用于根据所述内存申请请求中携带的句柄标识和待申请内存的内存大小,累计与所述句柄标识对应的所述应用程序占用的内存的总大小。

13.根据权利要求11或12所述的装置,其特征在于,所述装置还包括:

确定单元,用于获取所述应用程序的内存释放请求,根据所述内存释放请求中携带的待释放内存的地址确认所述待释放内存的大小;

更新单元,用于所述设备根据所述待释放内存的大小更新所述应用程序占用的内存的总大小。

14.根据权利要求13所述的装置,其特征在于,所述内存释放请求中还携带有句柄标识;

所述更新单元,用于根据所述内存释放请求中携带的句柄标识和所述待释放内存的大小,更新所述应用程序占用的内存总大小。

15.根据权利要求9-14任一项所述的装置,其特征在于,

所述采样单元,用于设置n个数组,对应用程序占用的内存的总大小进行采样,每获取到一个样本,就将该样本存储在对应的数组中,其中,当总采样次数m等于n时,按照采样顺序将样本依次存入这n个数组中;当总采样次数m大于n时,将第m个样本存入编号为m%n的数组,并覆盖该数组原来的样本,其中m%n的含义是m对n求余。

16.根据权利要求15所述的装置,其特征在于,

所述计算单元,用于令mic=0,i=0;计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差,根据sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差判断是否内存总大小是否增长,若是,则令mic=mic 1;判断i是否小于n-1,若是,则令i=i 1,返回执行计算sarr[(fsi i 1)%n]与sarr[(fsi i)%n]之差的步骤;其中,mic为内存增长次数,sarr[(fsi i 1)%n]为编号为[(fsi i 1)%n]对应的样本,fsi为第一个样本的编号,(fsi i 1)%n为fsi i 1对n取余;

所述检测单元,用于当所述mic大于或等于第一阈值时,确认所述内存发生泄漏。

17.一种内存泄露检测设备,其特征在于,所述设备包括存储器和处理器,

所述存储器,用于存储指令;

所述处理器,用于执行所述存储器中的所述指令,执行权利要求1-8任意一项所述的方法。

18.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得所述计算机执行以上权利要求1-8任意一项所述的方法。

技术总结
本申请实施例提供了一种内存泄漏检测方法、装置及设备,用于提高内存泄露检测的准确性。其中方法包括:设备对应用程序占用的内存的总大小进行M次采样,得到N个样本,并将所述N个样本按照采样顺序进行排列,其中所述M大于或等于N,所述N为大于1的正整数;所述设备根据所述N个样本中相邻两个样本之间的差值,确定所述内存的总大小的增长次数,所述相邻两个样本之间的差值是指所述相邻两个样本中采样时间较晚的样本与采样时间较早的样本之间的差值;当所述增长次数大于或等于第一阈值时,所述设备确认所述内存发生泄漏。

技术研发人员:雷建忠;张嘉庆;张斌;潘健
受保护的技术使用者:华为技术有限公司
技术研发日:2018.11.29
技术公布日:2020.06.05

转载请注明原文地址: https://bbs.8miu.com/read-59002.html

最新回复(0)