内存泄漏的检测方法、装置、终端设备及可读存储介质与流程

文档序号:16531524发布日期:2019-01-05 10:47阅读:181来源:国知局
内存泄漏的检测方法、装置、终端设备及可读存储介质与流程

本申请涉及计算机技术领域,特别是涉及一种内存泄漏的检测方法、装置、终端设备及可读存储介质。



背景技术:

随着计算机应用程序设计与开发的日益复杂,有效的进行内存分配、释放以及检测内存泄漏的问题变得越来越突出。内存泄漏是程序中己动态分配的堆内存由于某种原因未释放或无法释放,从而容易造成系统内存浪费,程序运行速度减慢甚至系统崩溃等严重后果。

相关技术中,对于内存泄漏的检测通常是在每次申请内存时,向内存头中手动写入一个内存释放时间,如果在内存释放时间到达时,内存未释放,则确定检测到内存泄漏。

上述技术方案由于需要在每次申请内存时,手动写入内存释放时间,因此增加了操作的繁琐性;并且如果填写的内存释放时间小于实际内存释放时间,会造成对检测结果的误判。



技术实现要素:

本申请实施例提供一种内存泄漏的检测方法、装置、终端设备及可读存储介质,以解决现有内存泄漏检测方式操作繁琐,且容易造成检测结果误判的问题。

具体地,本申请实施例是通过如下技术方案实现的:

第一方面,提供一种内存泄漏的检测方法,在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间,所述方法包括:

在到达检测周期时,遍历所述内存链表;

对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

第二方面,提供一种内存泄漏的检测装置,所述装置包括:

空间分配模块,用于在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

链表遍历模块,用于在到达检测周期时,遍历所述内存链表;

时间获取模块,用于对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

内存泄漏确定模块,用于根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

第三方面,提供一种终端设备,包括:内部总线,以及通过内部总线连接的存储器、处理器和外部接口;其中,

所述处理器,用于读取所述存储器上的机器可读指令,并执行所述指令以实现如下操作:

在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

在到达检测周期时,遍历所述内存链表;

对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

第四方面,提供一种计算机可读存储介质,包括:所述机器可读存储介质上存储有若干计算机指令,所述计算机指令被执行时进行如下处理:

在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

在到达检测周期时,遍历所述内存链表;

对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

由以上技术方案可以看出,本申请实施例中,在加入内存链表的内存节点的内存头中分配了用于记录内存使用时间的时间字节空间,因此在遍历到内存链表上的每个内存节点时,可以从该内存节点的时间字节空间中自动获取最近一次的内存使用时间,并根据该内存使用时间判断该内存节点是否发生内存泄漏。由于通过自动记录内存使用时间就可以进行内存泄漏的判断,因此减少了开发人员手动写入内存释放时间操作的繁琐性,同时避免了因内存释放时间选取不当造成对内存泄漏的误判。

附图说明

图1是本申请内存泄漏的检测实施例中的内存链表的结构示意图;

图2是本申请内存泄漏的检测方法的一个实施例流程图;

图3是本申请内存泄漏的检测方法的另一个实施例流程图;

图4为本申请内存泄漏的检测装置的一个实施例框图;

图5为本申请终端设备的一种硬件结构图。

具体实施方式

为了使本申请的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本申请进行详细描述。

内存是终端设备,例如pc中重要的部件之一,pc中所有程序都是通过cpu调用后在内存中运行,因此内存的性能对终端设备的影响非常大。任何程序正常使用内存的方式都是使用前先申请,使用结束之后进行释放,如果不释放,则会出现内存泄漏,导致后续此内存都无法被使用。因此当多个程序申请内存后,如果这些内存没有得到及时释放,可能会导致内存耗尽,从而导致终端设备无法正常工作。

通常终端设备内部通过内存链表维护已被申请的内存,内存链表是一种物理存储单元上非连续、非顺序的存储结构,每段被申请的内存对应内存链表上的一个内存节点,内存节点之间的逻辑顺序是通过链表中的指针链接次序实现的。

链表的类型可以包括:单向链表,双向链表以及循环链表。其中,双向链表的每个内存节点中都有两个指针,分别指向该内存节点的后继节点和前驱节点。因此从双向链表中的任意一个内存节点开始,都可以很方便地访问它的前驱节点和后继节点。本申请实施例以双向链表为例进行描述,双向链表的结构如图1所示。

由图1可知,双向链表可以包括:链表头,以及一个或多个内存节点,其中链表头包括:head(头指针)和count(函数),head可以指向第一个内存节点;每个内存节点可以包括内存头和数据空间;进一步的,本申请实施例中的内存头可以包括:位置字节空间、时间字节空间、指针空间等。其中,位置字节空间可以存储:函数名,文件名,行号等信息,时间字节空间可以存储当前内存的使用时间,指针空间用于存储前驱指针prev和后继指针next,所述前驱指针prev可以用于指向前一个内存节点,后继指针next可以用于指向后一个内存节点。对于申请的内存,利用链表头及内存节点中的前驱指针prev和后继指针next,将所申请的内存串联起来,构成内存链表。

本申请实施例中,由于在内存头中分配了用于记录内存使用时间的时间字节空间,因此在遍历内存链表时,可以从每个内存节点的时间字节空间中自动获取最近一次的内存使用时间,从而根据该内存使用时间判断该内存节点是否发生内存泄漏。与相关技术中手动写入内存泄漏时间相比,由于通过自动记录内存使用时间就可以进行内存泄漏的判断,因此减少了开发人员的操作繁琐性,同时可以避免因内存释放时间选取不当造成对内存泄漏的误判,提升内存泄漏检测的准确性。

参见图2,为本申请内存泄漏的检测方法的一个实施例流程图,该实施例可以包括如下步骤:

步骤201,在到达检测周期时,遍历内存链表;

本实施例中,可以按照预设的检测周期对内存泄漏进行检测,该检测周期可以为人为设定的一个常规的检测周期。例如:以检测周期为1分钟为例,则每隔1分钟,开始遍历内存链表。由于内存链表上包含了逻辑上连续的内存节点,遍历内存链表将会对内存节点进行逐一检测。

步骤202,对于每个遍历到的当前内存节点,从当前内存节点的时间字节空间中获取当前内存使用时间;

在遍历内存链表时,将当前遍历到的一个内存节点称为当前内存节点,结合前述图1描述可知,由于每个内存节点的内存中分配了位置字节空间和时间字节空间,因此在遍历到该当前内存节点时,可以从该当前内存节点的时间字节空间中获得该当前内存最近一次被使用的时间,该时间可以称为当前内存使用时间。

步骤203,根据当前内存使用时间确定当前内存节点是否发生内存泄漏。

在一个可选的实现方式中,在进行内存泄漏判断时,可以获得当前检测时间,即当前的系统时间,然后计算获取到的当前内存使用时间与该当前检测时间的时间差值,该时间差值表示当前内存节点未被使用的时长。将所得时间差值与预设的时间阈值进行比较,当所述时间差值大于所述预设的时间阈值时,确定所述当前内存节点发生内存泄漏,将泄漏的内存释放,并从内存链表上删除;当所述时间差值小于所述预设的时间阈值时,确定所述当前内存节点未发生内存泄漏,将未泄漏的内存也在遍历链表上删除,后续检测将不再检测前一次已被释放的内存。

在一个可选的例子中,上述预设的时间阈值可以根据内存使用频率的实际情况进行相应的设定。对于使用频率较高的内存,可以将时间阈值设置的偏小一些;对于使用频率较低的内存,可以将时间阈值设置的偏大一些。例如:高频率日志类的内存,几乎每隔两三分钟甚至是几秒钟的时间就会使用一次,因此可以将这类内存的时间阈值设置为3分钟;低频率使用的内存,有时每隔半个小时甚至是一个小时都不会被使用,因此可以将这类内存的时间阈值设置为2小时。需要说明的是,本例子中的使用频率较高和较低只是相对而言,所列举的例子并不对实际的分类和设置进行限制。相应的,在依据使用频率为不同类型的内存设置了时间阈值后,在遍历到当前内存节点并获取到该内存节点的时间差值后,可以根据当前内存的类型获取其对应的时间阈值,然后比较时间差值和时间阈值。

通过以上实施例可见,该实施例在加入内存链表的内存节点的内存头中分配了用于记录内存使用时间的时间字节空间,因此在遍历到内存链表上的每个内存节点时,可以从该内存节点的时间字节空间中自动获取最近一次的内存使用时间,并根据该内存使用时间判断该内存节点是否发生内存泄漏。由于通过自动记录内存使用时间就可以进行内存泄漏的判断,因此减少了开发人员手动写入内存释放时间操作的繁琐性,同时避免了因内存释放时间选取不当造成对内存泄漏的误判。

参见图3,为本申请内存泄漏的检测方法的另一个实施例流程图,该实施例对内存泄漏检测及检测结果输出进行了详细描述,该实施例可以包括如下步骤:

步骤301,在有内存节点加入内存链表时,在内存节点的内存头中分配时间字节空间和位置字节空间;

结合图1可知,当每次有新的内存申请时,可以相应在内存链表中加入新的内存节点,并为该内存节点分配对应的内存头和数据空间,进一步在内存头中分配时间字节空间和位置字节空间。其中,时间字节空间用于存储当前内存使用时间,位置字节空间用于存储函数名、文件号和行号等信息。

在本实施例中,内存头可以在内存节点空间的头部,也可以在内存节点空间的尾部,对此本实施例不进行限制,只要可以将相邻的内存节点关联起来一一对应即可。

步骤302,当有内存节点被使用时,调用预设的宏函数计算该内存节点的时间字节空间的地址;

如果内存链表上的某个当前内存节点被使用,那么利用宏函数通过当前内存节点位置字节空间的地址计算存储时间字节空间的地址。结合图1,具体的计算方法可以是根据当前内存节点位置字节空间的地址(data的地址),将其位置字节空间的地址偏移一段内存空间,偏移内存空间的大小可以根据内存节点存储时间字节空间地址(time的地址)减去当前内存节点位置字节空间内首字节使用的地址(data内首字节的地址)。

步骤303,按照地址将该内存节点对应的当前内存的使用时间写入时间字节空间;

将当前内存节点对应的当前内存的使用时间,通过宏函数的功能自动更新写入步骤302计算得到的时间字节空间地址内。

步骤304,在到达检测周期时,遍历内存链表;

步骤305,对于每个遍历到的当前内存节点,从当前内存节点的时间字节空间中获取当前内存使用时间;

步骤306,根据当前内存使用时间确定当前内存节点是否发生内存泄漏;

前述步骤304至步骤306与图2实施例中步骤201至步骤203一致,在此不再赘述。

步骤307,当确定当前内存节点发生内存泄漏时,输出当前内存节点的定位信息。

在一个可选的实现方式中,当确定当前内存节点发生泄漏时,将检测出泄漏的所述当前内存位置信息或者所述当前内存节点的内存位置信息和所述当前内存节点的未使用时长,反馈给开发人员,以便开发人员根据内存泄漏的定位信息快速确定内存泄漏的位置。其中,所述的内存位置信息至少包括以下一种信息:当前内存节点内存储的函数名、行号、文件名等相关信息。

通过以上实施例可见,该实施例在内存头中分配了用于记录内存使用时间的时间字节空间,因此在遍历内存链表时,可以从每个内存节点的时间字节空间中自动获取最近一次的内存使用时间,从而根据该内存使用时间判断该内存节点是否发生内存泄漏。由于通过自动记录内存使用时间就可以进行内存泄漏的判断,因此减少了开发人员的操作繁琐性,同时可以避免因内存释放时间选取不当造成对内存泄漏的误判,提升内存泄漏检测的准确性。

下面通过一个应用实例详细说明本申请实施例的内存泄漏检测过程。

假设有某个程序需要申请10个字节的内存空间,用来存储字符串abcdefghi。则该程序在申请内存空间时,系统会为该程序分配70个字节的内存空间,并将作为内存节点添加到内存链表中,其中内存节点包括60个字节的内存头,以及10个字节的数据空间。

在60个字节的内存头中,假设前面20个字节用来存储调用程序的函数名;第21-30个字节用来存储调用程序的行号;第31-44字节用来存储内存当前使用时间的时间字节空间,如:2018年08月15日15时00分00秒;第45-52个字节用来存储前驱指针prev,第53-60个字节用来存储后继指针next。在10个字节的数据空间中,即第60-70个字节用来存储字符串abcdefghi。

当70个字节的内存空间被使用时,利用宏函数的功能,将第60-70个字节内存储字符串abcdefghi的地址作为输入参数的地址,通过调用该宏函数计算得到第31-44字节用来存储内存当前使用时间字节空间的地址。具体的计算方法是将存储字符串abcdefghi的地址偏移一段内存空间,其偏移的内存空间的大小为内存当前使用时间的时间字节空间地址(2018年08月15日15时00分00秒的存储地址)减去存储字符串abcdefghi中首字母a的字节空间地址,即:在首字母a字节的位置处向前偏移30个字节得到内存当前使用时间位置。每次在使用所述内存前都调用一下宏函数,将当前内存的最新使用时间写入时间字节空间,自动记录所述内存节点的最新使用时间即当前内存使用时间(假设最新使用时间为2018年08月15日15时10分00秒)。

假设内存泄漏检测的时间周期为5分钟,则当距离上一次内存泄漏检测后的5分钟,遍历内存链表。当遍历到上述内存节点时,可以获得70个字节的内存空间的最新使用时间为2018年08月15日15时10分00秒(即所述内存当前使用时间由2018年08月15日15时00分00秒更新为2018年08月15日15时10分00秒)。

将70个字节的内存空间的最新使用时间2018年08月15日15时10分00秒与当前检测时间2018年08月15日15时20分00秒进行比较,若最新使用时间与当前检测时间的差值大于预设时间阈值5分钟,则认为70个字节的内存空间发生了泄漏,将泄漏的内存释放,并从内存链表上删除;若最新使用时间与当前检测时间的时间差值小于预设时间阈值5分钟,则认为70个字节的内存空间未发生泄漏,将未泄漏的内存也在遍历链表上删除,后续检测将不再检测前一次已被释放的内存。

如果确定当前70个字节的内存空间发生了内存泄漏,那么输出所述当前内存的定位信息;其中,所指的输出的定位信息可以为存储字符串abcdefghi的位置信息或者存储字符串的位置信息和70个字节的内存空间未使用时长。

与前述内存泄漏的检测方法的实施例相对应,本申请还提供了一种内存泄漏的检测装置的实施例。请参照图4,为本申请内存泄漏的检测装置的一个实施例框图,所述装置包括:空间分配模块401,链表遍历模块402,时间获取模块403,内存泄漏确定模块404。

其中,空间分配模块401,用于在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

链表遍历模块402,用于在到达检测周期时,遍历内存链表;

时间获取模块403,用于对于每个遍历到的当前内存节点,从当前内存节点的时间字节空间中获取当前内存使用时间;

内存泄漏确定模块404,用于根据当前内存使用时间确定当前内存节点是否发生内存泄漏。

在一个可选的例子中,所述装置还可以包括(图4中未示出):地址计算模块,时间存储模块。

地址计算模块,用于当所述当前内存节点被使用时,调用预设的宏函数计算所述时间字节空间的地址;

时间存储模块,用于按照所述地址将所述当前内存使用时间写入所述时间字节空间。

在另一个可选的例子中,内存泄漏确定模块404可以包括(图4中未示出):时间差值模块,时间比较模块,内存泄漏模块。

时间差值模块,用于计算所述当前内存使用时间与当前检测时间的时间差值,所述时间差值用于表示所述当前内存节点未被使用的时长;

时间比较模块,用于比较所述时间差值与预设的时间阈值;

内存泄漏模块,用于当所述时间差值大于所述时间阈值时,确定所述当前内存节点发生内存泄漏。

在另一个可选的例子中,所述装置还可以包括(图4中未示出):信息输出模块。

所述空间分配模块401,还用于在每个内存节点的内存头中分配用于记录内存位置信息的位置字节空间;其中,所述内存位置信息包括至少一个下述信息:函数名、文件名和行号;

信息输出模块,用于当确定所述前内存节点发生内存泄漏时,输出所述当前内存节点定位信息;

其中,所述定位信息包括:

所述当前内存节点的内存位置信息;或者,

所述当前内存节点的内存位置信息和所述当前内存节点的未使用时长。

由以上实施例可见,该实施例在内存节点的内存头中分配时间字节空间和位置字节空间,利用宏函数将该内存节点对应的当前内存的使用时间写入时间字节空间,通过周期性的遍历内存链表,遍历得到当前内存节点的时间字节空间中相对应的当前内存的使用时间,根据当前内存使用时间距离检测时间的时长,以便开发人员快速准确的确定是否发生内存泄漏。该实施例解决了因手动操作带来的繁琐问题,同时也提高了内存是否泄漏检测结果的准确性。

与前述内存泄漏的检测方法的实施例相对应,本申请还提供了一种终端设备的实施例。

请参照图5,为本申请终端设备的一个硬件结构图。所述终端设备包括:内部总线501,以及通过内部总线连接的存储器502,处理器503和外部接口504;其中,

所述处理器503,用于读取所述存储器上的机器可读指令,并执行所述指令以实现如下操作:

在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

在到达检测周期时,遍历所述内存链表;

对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

与前述内存泄漏的检测方法的实施例相对应,本申请还提供了一种计算机可读存储介质,包括:所述机器可读存储介质上存储有若干计算机指令,所述计算机指令被执行时进行如下处理:

在加入内存链表的每个内存节点的内存头中分配用于记录内存使用时间的时间字节空间;

在到达检测周期时,遍历所述内存链表;

对于每个遍历到的当前内存节点,从所述当前内存节点的时间字节空间中获取当前内存使用时间;

根据所述当前内存使用时间确定所述当前内存节点是否发生内存泄漏。

上述装置、终端设备、计算机可读取介质中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例、终端设备实施例、计算机可读存储介质实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

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