CN104572460A - 一种内存泄露的检测方法和装置 - Google Patents
一种内存泄露的检测方法和装置 Download PDFInfo
- Publication number
- CN104572460A CN104572460A CN201410850566.3A CN201410850566A CN104572460A CN 104572460 A CN104572460 A CN 104572460A CN 201410850566 A CN201410850566 A CN 201410850566A CN 104572460 A CN104572460 A CN 104572460A
- Authority
- CN
- China
- Prior art keywords
- memory
- distributed
- internal memory
- memory block
- time stamp
- 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
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供了一种内存泄露的检测方法和装置,内存中包括已分配内存的双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述方法包括:确定检测时间段区间;在所述双向链表中遍历出所述检测时间段区间内的内存头信息;依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。本发明可以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
Description
技术领域
本发明涉及测试技术领域,特别是涉及一种内存泄露的检测方法和一种内存泄露的检测装置。
背景技术
在计算机科学中,内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄露并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
随着现代软件规模日益扩大,在需要软件开发人员显示申请、释放内存的软件开发过程中,由于往往需要随着业务流或控制流的处理而进行大量的内存申请和释放,很容易造成在一些异常分支的遗漏释放而出现内存泄露的情形,然而这种内存泄露的事件一般都是少量、且隐蔽的,需要经过很长时间的积累甚至已经造成了严重后果才能被察觉。因此,软件开发人员难以检测和恢复泄露的内存。
目前,虽然已经有一些辅助工具可以协助进行内存泄露的检测,但由于这些辅助工具并不清楚软件开发人员的设计、使用意图,极易造成误判或漏判,且由于其插桩的实现或算法复杂性因素,往往会引起程序运行缓慢的问题,并且使用成本较高。
因此,软件开发人员检测和恢复泄露的内存存在这样几种思路,第一种是将系统运行过程中动态内存的所有申请、释放过程通过日志文件的形式保存下来供离线分析,所谓离线分析是指在目标系统外进行检测。然而,离线分析缺少实时性且不够直观,同时对日志文件的管理以及读写等慢速IO(Input/Output,输入/输出)操作导致软件性能降低。
第二种思路是支持手动提取当前已申请内存的相关信息并打印出来,采用提取多次打印的结果人工对照的方式进行检测,这种思路虽然可行,但人工对照费时费力,且不易操作。
第三种思路是在内存申请与内存释放时对内存地址的使用记录做Hash(哈希)运算查找,通过查找来添加或删除内存块的使用记录,然而,Hash运算需要申请一块额外的内存来记录原内存的申请、释放信息,因此,第三种思路的工作效率较低。
因此,目前需要本领域技术人员迫切解决的一个技术问题就是:提供一种内存泄露的检测方法和装置,用以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
发明内容
本发明实施例所要解决的技术问题是提供一种内存泄露的检测方法,用以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
相应的,本发明实施例还提供了一种内存泄露的检测装置,用以保证上述方法的实现及应用。
为了解决上述问题,本发明公开了一种内存泄露的检测方法,内存中包括已分配内存的双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述方法包括:
确定检测时间段区间;
在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
优选的,所述方法还包括:
若判定对应的一个或多个已分配的内存块发生内存泄露,回收所述对应的一个或多个已分配的内存块。
优选的,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述确定检测时间段区间的步骤包括:
获取当前时刻对应的当前时间戳;
采用预设的第一时间差和所述当前时间戳确定起始时间戳;
采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
优选的,所述内存头信息包括已分配的内存块的分配时间戳,所述在所述双向链表中遍历出所述检测时间段区间内的内存头信息的步骤包括:
在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
判断所述分配时间戳是否在所述检测时间段区间内;
若所述分配时间戳在所述检测时间段区间内,则提取出对应的内存头信息;
若所述分配时间戳不在所述检测时间段区间内,则忽略对应的内存头信息。
优选的,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,所述依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露的步骤包括:
依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放;
若判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放,则判定所述一个或多个已分配的内存块发生内存泄露;否则,判定所述一个或多个已分配的内存块未发生内存泄露。
根据本发明的实施例,还公开了一种内存泄露的检测装置,内存中包括双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述装置包括:
检测时间段区间确定模块,用于确定检测时间段区间;
内存头信息遍历模块,用于在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
内存泄露判断模块,用于依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
优选的,所述装置还包括:
已分配的内存块回收模块,用于在判定对应的一个或多个已分配的内存块发生内存泄露时,回收所述对应的一个或多个已分配的内存块。
优选的,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述检测时间段区间确定模块包括:
当前时间戳获取子模块,用于获取当前时刻对应的当前时间戳;
起始时间戳确定子模块,用于采用预设的第一时间差和所述当前时间戳确定起始时间戳;
终止时间戳确定子模块,用于采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
优选的,所述内存头信息包括已分配的内存块的分配时间戳,所述内存头信息遍历模块包括:
分配时间戳遍历子模块,用于在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
分配时间戳判断子模块,用于判断所述分配时间戳是否在所述检测时间段区间内;
第一判定子模块,用于在所述分配时间戳在所述检测时间段区间内时,提取出对应的内存头信息;
第二判定子模块,用于在所述分配时间戳不在所述检测时间段区间内时,忽略对应的内存头信息。
优选的,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,所述内存泄露判断模块包括:
已分配的内存块确定子模块,用于依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
已分配的内存块释放判断子模块,用于结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放;
泄露判定子模块,用于在判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放时,判定所述一个或多个已分配的内存块发生内存泄露。
与现有技术相比,本发明实施例包括以下优点:
本发明通过查询检测时间段区间内的内存头信息,可以监测到发生内存泄露的可疑的泄露点,有效缩小检测范围,从而降低查询结果规模,并且,双向链表及内存头信息对内存申请、释放的代码无需修改,仅需要在一个公共头文件中引用,避免影响用户使用,可以降低部署及实施的难度,因此,可以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
进一步地,本发明通过在用户申请内存时,预留空间用于存储内存头信息,并且将预留空间挂载在双向链表上,可以在用户释放内存时避免查找,通过直接定位可以快速摘除待释放内存的链表节点,在内存的申请、释放过程中避免了查找过程,执行时间极短,大大降低了对系统性能的消耗。
更进一步地,本发明通过起始时间戳、终止时间戳以及回收所述对应的一个或多个已分配的内存块,可以对指定检测时间段区间内由指定的某申请者申请的、特定大小的内存块集合进行强制释放,从而可以在系统不中断服务的情形下回收已泄露的内存,避免了重启单板或进程等破坏性的恢复操作,有效提升软件的稳定性指标。
更进一步地,本发明通过在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳,可以通过命令的方式迅速找到发生内存泄露的内存头信息,有效降低人力投入,结合内存头信息检测源码可以找到内在泄露的原因,因此,可以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
附图说明
图1示出了本发明的一种内存泄露的检测方法实施例的步骤流程图;
图2示出了本发明的一种内存泄露的检测方法实施例中双向链表的示意图;
图3示出了双向链表中节点的示意图;
图4示出了本发明的一种内存泄露的检测方法实施例的步骤流程图;
图5示出了本发明的一种内存泄露的检测装置实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
本发明实施例的核心构思之一在于,通过为每块内存预留监测空间存放内存头信息,记录每一块申请内存所对应的时间戳和申请者信息;而当用户内存释放时,能快速定位并删除该内存块的“已分配”属性;用户通过查看从起始时间戳T1开始到终止时间戳T2的检测时间段区间内申请且未释放的内存的内存头信息,判断出该内存的用途,从而确定是否发生内存泄露。
参照图1,示出了本发明的一种内存泄露的检测方法实施例的步骤流程图,内存中包括双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,具体可以包括如下步骤:
步骤101,确定检测时间段区间;
在具体实现中,检测时间段区间可以是当前时刻之前的一个时间段区间。
步骤102,在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
在实际应用中,双向链表可以存储在内存中,可以用于记录该内存中所有已分配的内存块。
内存头信息中可以包括时间属性,若时间属性位于检测时间段区间内,将该双向链表中的内存头信息遍历出来。
在本发明实施例的一种优选示例中,所述内存头信息包括已分配的内存块的分配时间戳、已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息。
参照图2,示出了本发明的一种内存泄露的检测方法实施例中双向链表的示意图。
如图2所示,双向链表可以包括链表头和一个或多个节点,其中,链表头可以包括头指针Head和Count函数,头指针Head可以用于指向第一个节点,节点可以包括后向指针Next、前向指针Prev、已分配的内存块的分配时间戳、已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息等,后向指针Next可以用于指向下一个节点,前向指针Prev可以用于指向前一个节点。
参照图3,示出了双向链表中节点的示意图。
如图3所示,节点占用M个字节,也可以称为M空间,用户在每次申请内存时,实际申请内存的空间可以比用户所需内存的空间多M个字节,该M个字节即可以用于存放内存头信息,并且,可以位于实际申请到的内存块的低端,内存头信息所占的M个字节的空间可以为监测内存泄露所需的记录空间;在M空间中可以记录本次用户申请的内存大小、调用者的函数名、调用者所在文件中的行号,以及分配时间戳等信息,并将该M空间作为双向链表的节点插入链表中;给用户返回的内存块地址是修正后的,即返回的内存块地址为紧邻在内存头信息之后的地址。
内存用户无需感知M空间的存在,当用户每次释放内存时,在内存释放函数的内部实现中,先根据用户入参的地址向前偏移M字节大小,获取到其M空间,也即是其在双向链表中的节点地址,然后将该节点从双向链表中删除。
在编码实现中,可以通过将标准库提供的malloc/free改造成宏函数的方式,使用户感受不到软件编码上的差异,有效降低代码移植的成本。具体实施方式可以为:
可以自定义my_malloc函数实现M空间,以及将该M空间作为双向链表的节点插入双向链表;
可以自定义my_free函数实现将节点从双向链表中删除;
以C语言为例,可以新建一个原型声明的头文件,其中至少应包含以下内容:
用户仅需要在有内存申请/释放操作的代码文件中直接的,或者,间接的引用该头文件即可。
需要说明的是,由于采用该泄露检测机制会引起内存的一些额外消耗,即M空间,在一些内存非常紧缺的系统中,可以考虑在产品稳定后通过添加编译选项宏开关MM_NO_LEAK_CHECK的方式恢复到常规的内存申请、释放方法。
本发明通过在用户申请内存时,预留空间用于存储内存头信息,并且将预留空间挂载在双向链表上,可以在用户释放内存时避免查找,通过直接定位可以快速摘除待释放内存的节点,在内存的申请、释放过程中避免了查找过程,执行时间极短,大大降低了对系统性能的消耗。
步骤103,依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
在具体应用中,遍历出的内存头信息可以对应一个或多个已分配的内存块,该一个或多个已分配的内存块可以为可疑的泄露点,即在检测时间段区间内已申请且仍未释放的内存列表信息,内存列表信息中可以包括三种用途的内存:
(1)初始化时申请的,运行过程中始终不会被释放;
(2)刚刚申请,正在使用,还未来得及释放的;
(3)泄露的内存。
通过排除第(1)、(2)用途的内存,结合源码判断可疑的泄露点中内存的用途,因此,可以判断一个或多个已分配的内存块是否发生内存泄露。
在本发明实施例的一种优选示例中,还包括:
若判定对应的一个或多个已分配的内存块发生内存泄露,回收所述对应的一个或多个已分配的内存块。
作为本发明具体应用的一种示例,可以提出一个对发生内存泄露的一个或多个已分配的内存块的回收命令,通过回收命令对双向链表中落在检测时间段区间、且满足入参指定的申请者位置信息的节点进行摘链,并对原始内存块执行释放回收。
本发明通过查询检测时间段区间内的内存头信息,可以监测到发生内存泄露的可疑的泄露点,有效缩小检测范围,从而降低查询结果规模,并且,双向链表及内存头信息对内存申请、释放的代码无需修改,仅需要在一个公共头文件中引用,避免影响用户使用,可以降低部署及实施的难度,因此,可以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时支持在执行实体生命周期内回收已泄露内存。
参照图4,示出了本发明的一种内存泄露的检测方法实施例的步骤流程图,内存中包括双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述内存头信息包括已分配的内存块的分配时间戳,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,具体可以包括如下步骤:
步骤401,确定检测时间段区间;
在本发明实施例的一种优选示例中,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述步骤401具体可以包括以下子步骤:
子步骤S101,获取当前时刻对应的当前时间戳;
子步骤S102,采用预设的第一时间差和所述当前时间戳确定起始时间戳;
子步骤S103,采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
在具体应用中,可以提供一个查询命令,用于查询从当前时刻之前第一时间差t1秒至当前时刻之前第二时间差t2秒之间的检测时间段区间内申请且仍未释放的内存块列表及内存头信息,因此,确定检测时间段区间可以包括两个参数:第一时间差t1和第二时间差t2,其中,第一时间差t1等于起始时间戳表征的起始时间与当前时间的差值,第二时间差t2等于终止时间戳表征的终止时间与当前时间的差值。
具体地,首先可以获取当前时刻对应的当前时间戳T0;然后可以根据第一时间差t1计算检测时间段区间的起始时刻点的起始时间戳T1,其中,一种计算方法可以是:若t1=0,则取上一次调用查询命令时计算所得的起始时间戳T1值为本次检测时间段区间的起始时间戳T1,否则起始时间戳T1=max(T0-t1,0);再可以根据第二时间差t2计算检测时间段区间的终止时刻点的终止时间戳T2,其中,一种计算方法可以是:T2=max(T0-t2,T1)。
通过调整检测时间段区间[T1,T2],起始时间戳T1对应的起始时刻可以选择在初始化完成之后的某个时刻,终止时间戳T2对应的终止时刻可以选择在当前时刻之前的某个时刻,使得在理论分析上该检测时间段区间[T1,T2]申请的内存都应该已经被释放;若[T1,T2]时间段申请的内存应该被释放而实际没有被释放,则该内存即是可疑的泄露点,需要有针对性的进一步排查。
需要说明的是,由于软件初始化过程中常常会申请一些常驻内存,因此,用户在查询泄露内存的时候,所选检测时间段区间[T1,T2]优选在软件初始化完成之后,以剔除不必要的检测样本,提升检测确认的效率。
本发明通过起始时间戳、终止时间戳以及回收所述对应的一个或多个已分配的内存块,可以对指定检测时间段区间内由指定的某申请者申请的、特定大小的内存块集合进行强制释放,从而可以在系统不中断服务的情形下回收已泄露的内存,避免了重启单板或进程等破坏性的恢复操作,有效提升软件的稳定性指标。
步骤402,在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
在实际应用中,可以遍历双向链表,将双向链表的节点中的分配时间戳遍历出来。
本发明通过在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳,可以通过命令的方式迅速找到发生内存泄露的内存头信息,有效降低人力投入,结合内存头信息检测源码可以找到内在泄露的原因,因此,可以实时并直观检测出内存泄露,提高软件性能,减少或避免人工操作,从而省时省力,降低操作难度,提高工作效率,降低成本,提高内存泄露检测的准确性,同时在执行实体生命周期内回收已泄露内存。
步骤403,判断所述分配时间戳是否在所述检测时间段区间内;若所述分配时间戳在所述检测时间段区间内,执行步骤404~步骤408;若所述分配时间戳不在所述检测时间段区间内,执行步骤409;
在具体应用中,可以判断遍历出来的分配时间戳是否落在检测时间段区间[T1,T2]中,若是,则执行步骤404~步骤408;若否,则执行步骤409。
步骤404,提取出对应的内存头信息;
具体而言,可以通过定时批处理或者手动调用查询命令,将分配时间戳落在[T1,T2]区间中对应的内存块的内存头信息打印出来,内存头信息至少可以包括:每个内存块所对应的用户所需空间大小、分配时间戳、调用者的函数名、调用者所在文件中的行号等。
步骤405,依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
在具体实现中,可以依据返回给用户的内存地址,以及,用户所需的内存大小(即已分配的内存块的内存大小-M字节)可以确定出一个或多个已分配的内存块。
步骤406,结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放而实际未释放;若判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放,则执行步骤407;否则,执行步骤408;
在实际应用中,不同的源码结合所述调用函数信息以及调用函数在文件中的位置信息可以有不同的情况,判断出该一个或多个已分配的内存块的用途,可以有效缩小检测范围,并进而分析出内存泄露的原因,若判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放,则执行步骤407;否则,执行步骤408。
步骤407,判定所述一个或多个已分配的内存块发生内存泄露;
若所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放,则判定一个或多个已分配的内存块发生内存泄露。
步骤408,判定所述一个或多个已分配的内存块未发生内存泄露。
若所述一个或多个已分配的内存块可以为未释放,则判定一个或多个已分配的内存块没有发生内存泄露。
步骤409,忽略对应的内存头信息。
当分配时间戳未落在[T1,T2]区间中时,忽略分配时间戳对应的内存头信息。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
参照图5,示出了本发明的一种内存泄露的检测装置实施例的结构框图,内存中包括双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,具体可以包括如下模块:
检测时间段区间确定模块501,用于确定检测时间段区间;
内存头信息遍历模块502,用于在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
内存泄露判断模块503,用于依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
在本发明实施例的一种优选示例中,还可以包括:
已分配的内存块回收模块,用于在判定对应的一个或多个已分配的内存块发生内存泄露时,回收所述对应的一个或多个已分配的内存块。
在本发明实施例的一种优选示例中,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述检测时间段区间确定模块501还可以包括:
当前时间戳获取子模块,用于获取当前时刻对应的当前时间戳;
起始时间戳确定子模块,用于采用预设的第一时间差和所述当前时间戳确定起始时间戳;
终止时间戳确定子模块,用于采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
在本发明实施例的一种优选示例中,所述内存头信息包括已分配的内存块的分配时间戳,所述内存头信息遍历模块502还可以包括:
分配时间戳遍历子模块,用于在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
分配时间戳判断子模块,用于判断所述分配时间戳是否在所述检测时间段区间内;
第一判定子模块,用于在所述分配时间戳在所述检测时间段区间内时,提取出对应的内存头信息;
第二判定子模块,用于在所述分配时间戳不在所述检测时间段区间内时,忽略对应的内存头信息。
在本发明实施例的一种优选示例中,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,所述内存泄露判断模块503还可以包括:
已分配的内存块确定子模块,用于依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
已分配的内存块释放判断子模块,用于结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放;
泄露判定子模块,用于在判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放时,判定所述一个或多个已分配的内存块发生内存泄露。
对于装置实施例而言,由于其与方法实施例1及方法实施例2基本相似,所以描述的比较简单,相关之处参见方法实施例1及方法实施例2的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种内存泄露的检测方法和一种内存泄露的检测装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种内存泄露的检测方法,其特征在于,内存中包括已分配内存的双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述方法包括:
确定检测时间段区间;
在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
2.根据权利要求1所述的检测方法,其特征在于,还包括:
若判定对应的一个或多个已分配的内存块发生内存泄露,回收所述对应的一个或多个已分配的内存块。
3.根据权利要求1或2所述的检测方法,其特征在于,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述确定检测时间段区间的步骤包括:
获取当前时刻对应的当前时间戳;
采用预设的第一时间差和所述当前时间戳确定起始时间戳;
采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
4.根据权利要求3所述的检测方法,其特征在于,所述内存头信息包括已分配的内存块的分配时间戳,所述在所述双向链表中遍历出所述检测时间段区间内的内存头信息的步骤包括:
在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
判断所述分配时间戳是否在所述检测时间段区间内;
若所述分配时间戳在所述检测时间段区间内,则提取出对应的内存头信息;
若所述分配时间戳不在所述检测时间段区间内,则忽略对应的内存头信息。
5.根据权利要求4所述的检测方法,其特征在于,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,所述依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露的步骤包括:
依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放;
若判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放,则判定所述一个或多个已分配的内存块发生内存泄露;否则,判定所述一个或多个已分配的内存块未发生内存泄露。
6.一种内存泄露的检测装置,其特征在于,内存中包括双向链表,所述双向链表包括一个或多个已分配的内存块的内存头信息,所述装置包括:
检测时间段区间确定模块,用于确定检测时间段区间;
内存头信息遍历模块,用于在所述双向链表中遍历出所述检测时间段区间内的内存头信息;
内存泄露判断模块,用于依据所述内存头信息判断对应的一个或多个已分配的内存块是否发生内存泄露。
7.根据权利要求6所述的检测装置,其特征在于,还包括:
已分配的内存块回收模块,用于在判定对应的一个或多个已分配的内存块发生内存泄露时,回收所述对应的一个或多个已分配的内存块。
8.根据权利要求6或7所述的检测装置,其特征在于,所述检测时间段区间包括起始时间戳和终止时间戳,所述终止时间戳大于所述起始时间戳,所述检测时间段区间确定模块包括:
当前时间戳获取子模块,用于获取当前时刻对应的当前时间戳;
起始时间戳确定子模块,用于采用预设的第一时间差和所述当前时间戳确定起始时间戳;
终止时间戳确定子模块,用于采用预设的第二时间差和所述当前时间戳确定终止时间戳,所述第一时间差大于第二时间差。
9.根据权利要求8所述的检测装置,其特征在于,所述内存头信息包括已分配的内存块的分配时间戳,所述内存头信息遍历模块包括:
分配时间戳遍历子模块,用于在所述双向链表中遍历出一个或多个已分配的内存块的分配时间戳;
分配时间戳判断子模块,用于判断所述分配时间戳是否在所述检测时间段区间内;
第一判定子模块,用于在所述分配时间戳在所述检测时间段区间内时,提取出对应的内存头信息;
第二判定子模块,用于在所述分配时间戳不在所述检测时间段区间内时,忽略对应的内存头信息。
10.根据权利要求9所述的检测装置,其特征在于,所述内存头信息还包括已分配的内存块的内存大小、调用函数信息以及调用函数在文件中的位置信息,所述内存泄露判断模块包括:
已分配的内存块确定子模块,用于依据所述已分配的内存块的内存大小确定出一个或多个已分配的内存块;
已分配的内存块释放判断子模块,用于结合所述调用函数信息以及调用函数在文件中的位置信息判断所述一个或多个已分配的内存块在所述当前时间戳之前是否需要释放;
泄露判定子模块,用于在判定所述一个或多个已分配的内存块在所述当前时间戳之前需要释放而实际未释放时,判定所述一个或多个已分配的内存块发生内存泄露。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410850566.3A CN104572460A (zh) | 2014-12-30 | 2014-12-30 | 一种内存泄露的检测方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410850566.3A CN104572460A (zh) | 2014-12-30 | 2014-12-30 | 一种内存泄露的检测方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104572460A true CN104572460A (zh) | 2015-04-29 |
Family
ID=53088592
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410850566.3A Pending CN104572460A (zh) | 2014-12-30 | 2014-12-30 | 一种内存泄露的检测方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104572460A (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105897359A (zh) * | 2016-06-12 | 2016-08-24 | 广州杰赛科技股份有限公司 | 一种直放站带内载波泄漏抑制测试方法与装置 |
CN106407114A (zh) * | 2016-09-20 | 2017-02-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
CN107783908A (zh) * | 2017-11-07 | 2018-03-09 | 晶晨半导体(上海)股份有限公司 | 一种基于Linux内核内存泄露的检测方法 |
CN107844394A (zh) * | 2017-11-15 | 2018-03-27 | 杭州迪普科技股份有限公司 | 一种内存泄漏的定位方法及装置 |
CN109144872A (zh) * | 2018-08-20 | 2019-01-04 | 杭州迪普科技股份有限公司 | 内存泄漏的检测方法、装置、终端设备及可读存储介质 |
WO2019019713A1 (zh) * | 2017-07-24 | 2019-01-31 | 平安科技(深圳)有限公司 | 检测应用程序内存泄露的方法、终端及可读存储介质 |
CN111858317A (zh) * | 2020-06-30 | 2020-10-30 | 北京金山云网络技术有限公司 | 内存泄漏的检测方法和装置 |
CN111859372A (zh) * | 2020-07-29 | 2020-10-30 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
CN112346894A (zh) * | 2019-08-09 | 2021-02-09 | 腾讯科技(深圳)有限公司 | 内存泄露检测方法、装置、系统及计算机设备 |
CN112463632A (zh) * | 2020-12-11 | 2021-03-09 | 苏州浪潮智能科技有限公司 | 一种内存泄露检测的方法和设备 |
CN113377522A (zh) * | 2020-03-09 | 2021-09-10 | 大唐移动通信设备有限公司 | 内存池中内存块的处理方法、装置、电子设备和存储介质 |
CN113835920A (zh) * | 2021-09-26 | 2021-12-24 | 歌尔科技有限公司 | 内存异常监测方法、装置及计算机存储介质 |
CN113867951A (zh) * | 2021-09-26 | 2021-12-31 | 杭州安恒信息安全技术有限公司 | 一种内存管理方法、装置及相关设备 |
CN116795650A (zh) * | 2023-06-29 | 2023-09-22 | 浙江海得智慧能源有限公司 | 一种储能系统运行状态监测方法、系统及设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1845080A (zh) * | 2005-04-07 | 2006-10-11 | 华为技术有限公司 | 内存泄漏检测及防止的方法 |
CN101145128A (zh) * | 2007-06-13 | 2008-03-19 | 中兴通讯股份有限公司 | 一种检测内存泄露的方法 |
US7827538B2 (en) * | 2005-07-27 | 2010-11-02 | International Business Machines Corporation | Memory leak detection |
CN101944115A (zh) * | 2010-09-14 | 2011-01-12 | 杭州海康威视数字技术股份有限公司 | 一种日志搜索方法和系统 |
CN102073591A (zh) * | 2011-01-14 | 2011-05-25 | 福建星网视易信息系统有限公司 | 嵌入式系统内存占用状况检测方法及系统 |
CN102866947A (zh) * | 2012-08-29 | 2013-01-09 | 深圳市共进电子股份有限公司 | 一种Linux内核内存泄漏的检测方法 |
CN103914376A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 一种内存泄露的快速定位方法 |
-
2014
- 2014-12-30 CN CN201410850566.3A patent/CN104572460A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1845080A (zh) * | 2005-04-07 | 2006-10-11 | 华为技术有限公司 | 内存泄漏检测及防止的方法 |
US7827538B2 (en) * | 2005-07-27 | 2010-11-02 | International Business Machines Corporation | Memory leak detection |
CN101145128A (zh) * | 2007-06-13 | 2008-03-19 | 中兴通讯股份有限公司 | 一种检测内存泄露的方法 |
CN101944115A (zh) * | 2010-09-14 | 2011-01-12 | 杭州海康威视数字技术股份有限公司 | 一种日志搜索方法和系统 |
CN102073591A (zh) * | 2011-01-14 | 2011-05-25 | 福建星网视易信息系统有限公司 | 嵌入式系统内存占用状况检测方法及系统 |
CN102866947A (zh) * | 2012-08-29 | 2013-01-09 | 深圳市共进电子股份有限公司 | 一种Linux内核内存泄漏的检测方法 |
CN103914376A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 一种内存泄露的快速定位方法 |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105897359A (zh) * | 2016-06-12 | 2016-08-24 | 广州杰赛科技股份有限公司 | 一种直放站带内载波泄漏抑制测试方法与装置 |
CN106407114A (zh) * | 2016-09-20 | 2017-02-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
CN106407114B (zh) * | 2016-09-20 | 2017-12-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
WO2019019713A1 (zh) * | 2017-07-24 | 2019-01-31 | 平安科技(深圳)有限公司 | 检测应用程序内存泄露的方法、终端及可读存储介质 |
CN107783908A (zh) * | 2017-11-07 | 2018-03-09 | 晶晨半导体(上海)股份有限公司 | 一种基于Linux内核内存泄露的检测方法 |
CN107844394B (zh) * | 2017-11-15 | 2020-12-29 | 杭州迪普科技股份有限公司 | 一种内存泄漏的定位方法及装置 |
CN107844394A (zh) * | 2017-11-15 | 2018-03-27 | 杭州迪普科技股份有限公司 | 一种内存泄漏的定位方法及装置 |
CN109144872A (zh) * | 2018-08-20 | 2019-01-04 | 杭州迪普科技股份有限公司 | 内存泄漏的检测方法、装置、终端设备及可读存储介质 |
CN112346894A (zh) * | 2019-08-09 | 2021-02-09 | 腾讯科技(深圳)有限公司 | 内存泄露检测方法、装置、系统及计算机设备 |
CN112346894B (zh) * | 2019-08-09 | 2023-04-14 | 腾讯科技(深圳)有限公司 | 内存泄露检测方法、装置、系统及计算机设备 |
CN113377522A (zh) * | 2020-03-09 | 2021-09-10 | 大唐移动通信设备有限公司 | 内存池中内存块的处理方法、装置、电子设备和存储介质 |
CN111858317A (zh) * | 2020-06-30 | 2020-10-30 | 北京金山云网络技术有限公司 | 内存泄漏的检测方法和装置 |
CN111858317B (zh) * | 2020-06-30 | 2024-10-01 | 北京金山云网络技术有限公司 | 内存泄漏的检测方法和装置 |
CN111859372A (zh) * | 2020-07-29 | 2020-10-30 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
CN111859372B (zh) * | 2020-07-29 | 2023-08-22 | 中国工商银行股份有限公司 | 堆内存攻击的检测方法、装置和电子设备 |
CN112463632A (zh) * | 2020-12-11 | 2021-03-09 | 苏州浪潮智能科技有限公司 | 一种内存泄露检测的方法和设备 |
CN112463632B (zh) * | 2020-12-11 | 2022-06-07 | 苏州浪潮智能科技有限公司 | 一种内存泄露检测的方法和设备 |
CN113835920A (zh) * | 2021-09-26 | 2021-12-24 | 歌尔科技有限公司 | 内存异常监测方法、装置及计算机存储介质 |
CN113867951A (zh) * | 2021-09-26 | 2021-12-31 | 杭州安恒信息安全技术有限公司 | 一种内存管理方法、装置及相关设备 |
CN116795650A (zh) * | 2023-06-29 | 2023-09-22 | 浙江海得智慧能源有限公司 | 一种储能系统运行状态监测方法、系统及设备 |
CN116795650B (zh) * | 2023-06-29 | 2024-05-03 | 浙江海得智慧能源有限公司 | 一种储能系统运行状态监测方法、系统及设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104572460A (zh) | 一种内存泄露的检测方法和装置 | |
US9613073B2 (en) | Managing object lifetime in a cyclic graph | |
US20080263062A1 (en) | Method and system for including data quality in data streams | |
US9558055B2 (en) | System level memory leak detection | |
US9003240B2 (en) | Blackbox memory monitoring with a calling context memory map and semantic extraction | |
CN104182320A (zh) | 一种监控内存泄漏的方法及装置 | |
CN112749396A (zh) | 安全漏洞知识图谱的构建方法、装置、设备和存储介质 | |
CN104346384A (zh) | 一种小文件处理方法及装置 | |
US20110296132A1 (en) | Garbage collection in an in-memory replication system | |
CN104636401B (zh) | 一种scada系统数据回滚的方法及装置 | |
CN103309796A (zh) | 一种组件对象模型对象的监控方法和装置 | |
CN105094710A (zh) | 基于哈希表的单进程动态存储管理方法 | |
JP2017531852A (ja) | リソースリーク検出の方法、装置及びシステム | |
CN106997316A (zh) | 内存异常增长的检测系统及方法 | |
CN105183542A (zh) | 一种内存管理方法及系统 | |
CN104951370A (zh) | 一种内存管理方法及装置 | |
CN105184156A (zh) | 一种安全威胁管理方法和系统 | |
CN108733567A (zh) | 软件资源泄露情况的监测方法及系统 | |
CN102685590B (zh) | 机顶盒内存管理方法及装置 | |
CN103902445A (zh) | 一种回归测试对象确定方法及装置 | |
CN105045542B (zh) | 一种实现快照管理的方法及装置 | |
CN115794553A (zh) | 一种内存泄露检测方法、装置、设备及介质 | |
CN102930046B (zh) | 数据处理方法、计算节点及系统 | |
CN114860432A (zh) | 一种内存故障的信息确定方法及装置 | |
CN114077532A (zh) | 一种sql语句执行效率检测方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20150429 |
|
RJ01 | Rejection of invention patent application after publication |