CN110727585A - 内存泄漏检测方法、装置、电子设备及可读存储介质 - Google Patents
内存泄漏检测方法、装置、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN110727585A CN110727585A CN201910858218.3A CN201910858218A CN110727585A CN 110727585 A CN110727585 A CN 110727585A CN 201910858218 A CN201910858218 A CN 201910858218A CN 110727585 A CN110727585 A CN 110727585A
- Authority
- CN
- China
- Prior art keywords
- memory
- linked list
- detection
- nodes
- node
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供一种内存泄漏检测方法、装置、电子设备及可读存储介质。所述方法包括:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录申请内存信息预设检测周期之后,得到内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。本发明实施例过滤掉所有伴随操作系统启动而申请,直至操作系统关闭才释放的内存节点,大大降低了工作量。
Description
技术领域
本发明实施例涉及通信技术领域,具体涉及一种内存泄漏检测方法、装置、电子设备及可读存储介质。
背景技术
当程序运行时,程序会根据功能需求向操作系统申请用于存放数据的空间,操作系统从内存的堆栈空间为程序分配指定内存。一般情况下,当这段空间没有作用后,程序应主动释放这部分空间,将空间让给操作系统中的其他程序继续使用。如果程序中动态分配的内存由于某种原因没有释放,导致系统无法再次分配该内存,将造成内存泄漏,导致操作系统中可用内存不断减小,系统运行减缓,直至系统无法再为程序分配内存空间。
现有技术下,对于解决内存泄漏的检测和定位问题,是在操作系统内存分配的模块中,为分配的内存打上标记,当内存释放时,将标记清除。当操作人员需要分析是否存在内存泄漏时,可以将操作系统中打上标记未清除的内存信息及其标记打出,以定位出申请但未释放内存的位置,从这些位置中查找内存泄漏的位置。
然而许多程序或内核模块是伴随操作系统启动而启动,直至操作系统关闭才关闭的。这些程序和模块申请的内存往往存在于整个操作系统的生命周期中,不一定会释放,使用上述方法需要测试和开发人员对每一个未释放点进行分析,是否真正存在内存泄漏,而这往往耗时耗力,因为在一个庞大的系统中,这样的节点可能有成千上万个,导致排查内存泄漏效率低,耗费资源大。
发明内容
针对现有技术中的缺陷,本发明实施例提供了一种内存泄漏检测方法、装置、电子设备及可读存储介质。
第一方面,本发明实施例提供一种内存泄漏检测方法,包括:
建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;
确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;
根据所述内存检测链表,判断是否发生内存泄漏。
如上述方法,可选地,还包括:
在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
如上述方法,可选地,所述得到内存检测链表具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
如上述方法,可选地,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
如上述方法,可选地,所述得到内存检测链表具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
如上述方法,可选地,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
如上述方法,可选地,所述预设排序方法包括:冒泡排序法、选择排序法、插入排序法、希尔排序法、快速排序法、归并排序法或堆排序法。
第二方面,本发明实施例提供一种内存泄漏检测装置,包括:
记录模块,用于建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;
过滤模块,用于确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;
检测模块,用于根据所述内存检测链表,判断是否发生内存泄漏。
如上述装置,可选地,还包括:
删除模块,用于在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
如上述装置,可选地,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
如上述装置,可选地,所述检测模块具体用于:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
如上述装置,可选地,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
如上述装置,可选地,所述检测模块具体用于:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
第三方面,本发明实施例提供一种电子设备,包括:
存储器和处理器,所述处理器和所述存储器通过总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如下方法:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。
第四方面,本发明实施例提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如下方法:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。
本发明实施例提供的内存泄漏检测方法,在操作系统启动后利用内存记录链表记录所有申请但未释放的内存节点,在需要进行内存泄漏检测时,过滤掉所有伴随操作系统启动而申请,直至操作系统关闭才释放的内存节点,方便测试人员定位故障,大大降低了工作量。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的内存泄漏检测方法流程示意图;
图2为本发明实施例提供的内存泄漏检测装置的结构示意图;
图3为本发明实施例提供的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的内存泄漏检测方法流程示意图,如图1所示,该方法包括:
步骤S11、建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;
具体地,本发明实施例既可以应用于应用程序内存泄漏检测,也可以应用于内核应用程序内存泄漏检测,包括但不限于linux操作系统、windows操作系统、Android操作系统等。用于检测内存泄漏的内存泄漏检测装置安装在系统内存池与系统内存接口中间,内存泄漏检测装置预先建立内存记录链表,用于记录每次申请内存的信息。当系统启动后,在程序整个编译过程中,当系统申请内存时,会调用内存申请函数,如alloc函数,当系统调用alloc函数时,在内存记录链表中增加节点,为本次申请的内存打上标记,记录申请内存的函数(即标记函数)、申请的内存信息等,标记包括但不限于内存标记、标记函数、申请内存的堆栈信息、申请内存信息、内存申请的时刻等。其中,申请内存信息包括申请内存的地址、长度等,标记函数可以用程序文件名、函数名、代码行号等综合表示,申请内存的堆栈信息是指从alloc函数到标记函数的堆栈大小,申请内存的时刻为标记函数当前调用alloc函数的时刻。
这样,在系统运行过程中,内存记录链表记录了所有已经申请的内存信息。这些内存信息包括了伴随操作系统启动而启动,直至操作系统关闭才关闭的申请内存信息。
步骤S12、确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;
具体地,当内存泄漏检测装置确定需要进行内存泄漏检测时,即到达内存泄漏检测周期或者接收到内存泄漏检测指令之后,内存泄漏检测装置从内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,之后继续记录申请的内存节点一段时间,例如继续记录申请内存信息一个预设检测周期之后,得到新的内存记录链表,将该新的内存记录链表记为内存检测链表,即内存检测链表包含了在一个预设检测周期内记录的申请内存的节点,这些节点中记录了申请内存的时刻和申请内存的堆栈信息。此时的内存检测链表删除了在启动检测之前的所有申请内存的节点,这些节点中就包括了伴随操作系统启动而申请,直至操作系统关闭才释放的内存节点。
步骤S13、根据所述内存检测链表,判断是否发生内存泄漏。
具体地,由于内存检测链表已经过滤了伴随操作系统启动而申请,直至操作系统关闭才释放的内存节点,排除了大量干扰节点,因此,测试人员可以根据内存检测链表进行判断是否发生了内存泄漏,并且内存检测链表还展示了可能泄漏的位置,方便测试人员定位故障,大大降低了工作量。
本发明实施例提供的内存泄漏检测方法,在操作系统启动后利用内存记录链表记录所有申请但未释放的内存节点,在需要进行内存泄漏检测时,过滤掉所有伴随操作系统启动而申请,直至操作系统关闭才释放的内存节点,方便测试人员定位故障,大大降低了工作量。
在上述实施例的基础上,进一步地,还包括:
在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
具体地,当需要释放内存时,系统会调用释放内存函数,如free函数,此时,内存泄漏检测装置会将释放的内存对应的节点从内存记录链表中删除。例如,通过调用free函数,确定需要释放的内存标记为ID1,则从内存记录链表中删除内存标记ID1的节点,这样就可过滤到所有已经释放的内存节点,避免了内存泄漏检测的误判。
在上述实施例的基础上,进一步地,所述将所述新的内存记录链表作为内存检测链表具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
具体地,对记录预设检测周期的申请内存信息之后的新的内存记录链表,中的节点进行排序,以方便测试人员进行内存泄漏检测。由于申请内存的时长是判断内存泄漏的一个重要参数,因此,可以针对新的内存记录链表中的每个节点,按照预设排序方法,对申请内存的时刻进行先后排序,得到时间排序的内存检测链表,预设的排序方法包括但不限于冒泡排序法、选择排序法、插入排序法、希尔排序法、快速排序法、归并排序法或堆排序法等,以上排序方法为本领域技术人员熟知的排序算法,此处不再赘述。在该内存检测链表中,申请内存的时刻距当前时刻越远,其在排序的内存检测链表中越靠前。这样,从时间维度对内存泄漏检测链表进行展示,方便测试人员查找内存泄漏点,减小了测试人员定位内存泄漏的工作量,实现了内存泄漏的精确定位。
在上述各实施例的基础上,进一步地,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
具体地,对内存检测链表进行时间维度排序之后,根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻,例如设置预设时间阈值为1小时,则在当前时刻减去1小时,记为内存泄漏参考时刻,即在内存泄漏参考时刻之前申请且未释放的内存节点为发生内存泄漏的节点。
确定出内存泄漏参考时刻之后,遍历时间排序的内存件链表,查找到申请内存的时刻在内存泄漏参考时刻之后且与内存泄漏参考时刻的差值最小的节点,记为第一节点,将时间排序的内存检测链表中第一节点之前的所有节点确定为内存泄漏点,根据这些节点的堆栈信息和标记函数,定位发生内存泄漏的位置信息。使用时间维度进行信息展示,即按内存保持时间对未释放节点进行排列,保持时间越久的未释放节点,越有可能为内存泄漏点,有利于快速定位内存泄漏节点。
在上述各实施例的基础上,进一步地,所述将所述新的内存记录链表作为内存检测链表具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
具体地,对记录预设检测周期的申请内存信息之后的新的内存记录链表中的节点进行排序,以方便测试人员进行内存泄漏检测。由于调用位置的申请频率是判断内存泄漏的一个重要参数,因此,可以针对新的内存记录链表中的每个节点,按照预设排序方法,对申请内存的堆栈信息的频率进行排序,得到频率排序的内存检测链表,预设的排序方法包括但不限于冒泡排序法、选择排序法等。具体地,首先遍历内存检测链表,查找同一堆栈信息在内存检测链表中出现的次数,再根据出现次数,使用冒泡排序、选择排序等排序算法进行排序。在该内存检测链表中,申请内存的堆栈信息的频率越高,其在排序的内存检测链表中越靠前。这样,从申请位置维度对内存泄漏检测链表进行展示,方便测试人员查找内存泄漏点,减小了测试人员定位内存泄漏的工作量,实现了内存泄漏的精确定位。测试人员根据展示的内存信息,能够快速定位内存泄漏节点。
在上述各实施例的基础上,进一步地,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
具体地,申请位置不断申请新的内存将造成内存使用升高,导致内存泄漏,因此,在得到频率排序的内存检测链表之后,根据预设频率阈值,遍历频率排序的内存检测链表,查找堆栈信息的申请频率小于预设频率阈值,且与预设频率阈值的差值最小的节点,记为第二节点,将频率排序的内存检测链表中,第二节点之前的所有节点为内存泄漏点。例如,设置一个申请位置申请10次或以上内存且未释放则发生内存泄漏,则遍历频率排序的内存检测链表,查找节点的堆栈信息出现的频率小于10且与10差值最小的点,将该节点之前的所有节点,即堆栈信息出现的频率大于10的节点确定为内存泄漏节点。
在实际应用中,还可以结合两种维度进行信息展示,即按内存保持时间对未释放节点进行排列和按未释放节点的申请位置出现频率对节点进行排序,出现频率越高保持时间越久的未释放节点,越有可能为内存泄漏点。
本发明实施例提供的内存泄漏检测方法,在内存泄漏检测时,过滤了静态申请的内存以及已存在的内存节点,通过内存申请时间以及未释放节点的申请频率确定内存泄漏位置,大大减小了开发人员定位内存泄漏的工作量,实现了内存泄漏的精确定位。
基于同样的发明构思,本发明实施例还提供一种内存泄漏检测装置,如图2所示,包括:记录模块21、过滤模块22和检测模块23,其中:
记录模块21用于建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;过滤模块22用于确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;检测模块23用于根据所述内存检测链表,判断是否发生内存泄漏。
如上述装置,进一步地,还包括:
删除模块,用于在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
如上述装置,进一步地,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
如上述装置,进一步地,所述检测模块具体用于:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
如上述装置,进一步地,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
如上述装置,进一步地,所述检测模块具体用于:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
本发明实施例提供的装置,用于实现上述方法,其功能具体参照上述方法实施例,此处不再赘述。
图3为本发明实施例提供的电子设备的结构示意图,如图3所示,所述设备包括:处理器(processor)31、存储器(memory)32和总线33;
其中,处理器31和存储器32通过所述总线33完成相互间的通信;
处理器31用于调用存储器32中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。
本发明实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。
本发明实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;根据所述内存检测链表,判断是否发生内存泄漏。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上各实施例仅用以说明本发明的实施例的技术方案,而非对其限制;尽管参照前述各实施例对本发明的实施例进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明的各实施例技术方案的范围。
Claims (14)
1.一种内存泄漏检测方法,其特征在于,包括:
建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;
确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为内存检测链表;
根据所述内存检测链表,判断是否发生内存泄漏。
2.根据权利要求1所述的方法,其特征在于,还包括:
在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
3.根据权利要求2所述的方法,其特征在于,所述将所述新的内存记录链表作为内存检测链表,具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
4.根据权利要求3所述的方法,其特征在于,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
5.根据权利要求2所述的方法,其特征在于,所述将所述新的内存记录链表作为内存检测链表具体包括:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
6.根据权利要求5所述的方法,其特征在于,所述根据所述内存检测链表,判断是否发生内存泄漏,包括:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
7.一种内存泄漏检测装置,其特征在于,包括:
记录模块,用于建立内存记录链表,在程序编译过程中,当调用内存申请函数申请内存时,在所述内存记录链表中增加节点,并在所述节点中记录申请内存的时刻和申请内存的堆栈信息;
过滤模块,用于确定需要进行内存泄漏检测时,从所述内存记录链表中删除记录的申请内存的时刻在当前时刻之前的所有节点,并继续记录预设检测周期的申请内存信息之后,得到新的内存记录链表,将所述新的内存记录链表作为得到内存检测链表;
检测模块,用于根据所述内存检测链表,判断是否发生内存泄漏。
8.根据权利要求7所述的装置,其特征在于,还包括:
删除模块,用于在程序编译过程中,当调用内存释放函数释放内存时,从所述内存记录链表中查找到对应的节点并删除。
9.根据权利要求8所述的装置,其特征在于,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的时刻的先后顺序,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到时间排序的内存检测链表。
10.根据权利要求9所述的装置,其特征在于,所述检测模块具体用于:
根据预设时间阈值和当前时刻,计算出内存泄漏参考时刻;
从所述时间排序的内存检测链表中查找到申请内存的时刻在所述内存泄漏参考时刻之后且与所述内存泄漏参考时刻的差值最小的第一节点;
确定所述时间排序的内存检测链表中,所述第一节点之前的所有节点为内存泄漏点。
11.根据权利要求8所述的装置,其特征在于,所述过滤模块具体用于:
针对所述新的内存记录链表中的每个节点,按照申请内存的堆栈信息,确定节点中每个堆栈信息的申请频率,按照堆栈信息的申请频率,按预设排序方法对所述新的内存记录链表中的所有节点进行排序,得到频率排序的内存检测链表。
12.根据权利要求11所述的装置,其特征在于,所述检测模块具体用于:
根据预设频率阈值,从所述频率排序的内存检测链表中查找到堆栈信息的申请频率小于所述预设频率阈值,且与所述预设频率阈值的差值最小的第二节点;
确定所述频率排序的内存检测链表中,所述第二节点之前的所有节点为内存泄漏点。
13.一种电子设备,其特征在于,包括:
存储器和处理器,所述处理器和所述存储器通过总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至6任一所述的方法。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910858218.3A CN110727585B (zh) | 2019-09-11 | 2019-09-11 | 内存泄漏检测方法、装置、电子设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910858218.3A CN110727585B (zh) | 2019-09-11 | 2019-09-11 | 内存泄漏检测方法、装置、电子设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110727585A true CN110727585A (zh) | 2020-01-24 |
CN110727585B CN110727585B (zh) | 2023-07-21 |
Family
ID=69217993
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910858218.3A Active CN110727585B (zh) | 2019-09-11 | 2019-09-11 | 内存泄漏检测方法、装置、电子设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110727585B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631941A (zh) * | 2020-12-31 | 2021-04-09 | 广州鲁邦通物联网科技有限公司 | 定位linux内核slub内存泄漏的方法和系统 |
CN115220970A (zh) * | 2021-12-10 | 2022-10-21 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
CN117112193A (zh) * | 2023-04-10 | 2023-11-24 | 荣耀终端有限公司 | 内存资源管理方法及电子设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030061597A1 (en) * | 2001-09-17 | 2003-03-27 | Curtis James R. | Method to detect unbounded growth of linked lists in a running application |
CN101162436A (zh) * | 2006-10-13 | 2008-04-16 | 中兴通讯股份有限公司 | 一种通信设备系统中内存泄漏的检测方法 |
US20080301646A1 (en) * | 2007-05-29 | 2008-12-04 | Satish Chandra Gupta | Detecting Dangling Pointers and Memory Leaks Within Software |
CN102866947A (zh) * | 2012-08-29 | 2013-01-09 | 深圳市共进电子股份有限公司 | 一种Linux内核内存泄漏的检测方法 |
CN105260314A (zh) * | 2015-11-03 | 2016-01-20 | 上海斐讯数据通信技术有限公司 | 内存泄漏的监测方法 |
CN106610892A (zh) * | 2015-10-23 | 2017-05-03 | 腾讯科技(深圳)有限公司 | 内存泄漏检测方法和装置 |
CN107608885A (zh) * | 2017-09-13 | 2018-01-19 | 郑州云海信息技术有限公司 | 内存泄漏点的定位方法、装置、系统及可读存储介质 |
CN109144872A (zh) * | 2018-08-20 | 2019-01-04 | 杭州迪普科技股份有限公司 | 内存泄漏的检测方法、装置、终端设备及可读存储介质 |
-
2019
- 2019-09-11 CN CN201910858218.3A patent/CN110727585B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030061597A1 (en) * | 2001-09-17 | 2003-03-27 | Curtis James R. | Method to detect unbounded growth of linked lists in a running application |
CN101162436A (zh) * | 2006-10-13 | 2008-04-16 | 中兴通讯股份有限公司 | 一种通信设备系统中内存泄漏的检测方法 |
US20080301646A1 (en) * | 2007-05-29 | 2008-12-04 | Satish Chandra Gupta | Detecting Dangling Pointers and Memory Leaks Within Software |
CN102866947A (zh) * | 2012-08-29 | 2013-01-09 | 深圳市共进电子股份有限公司 | 一种Linux内核内存泄漏的检测方法 |
CN106610892A (zh) * | 2015-10-23 | 2017-05-03 | 腾讯科技(深圳)有限公司 | 内存泄漏检测方法和装置 |
CN105260314A (zh) * | 2015-11-03 | 2016-01-20 | 上海斐讯数据通信技术有限公司 | 内存泄漏的监测方法 |
CN107608885A (zh) * | 2017-09-13 | 2018-01-19 | 郑州云海信息技术有限公司 | 内存泄漏点的定位方法、装置、系统及可读存储介质 |
CN109144872A (zh) * | 2018-08-20 | 2019-01-04 | 杭州迪普科技股份有限公司 | 内存泄漏的检测方法、装置、终端设备及可读存储介质 |
Non-Patent Citations (1)
Title |
---|
朴艳丽等: "编程实践中内存泄漏的检测与处理", 《中国传媒科技》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631941A (zh) * | 2020-12-31 | 2021-04-09 | 广州鲁邦通物联网科技有限公司 | 定位linux内核slub内存泄漏的方法和系统 |
CN112631941B (zh) * | 2020-12-31 | 2022-04-19 | 广州鲁邦通物联网科技股份有限公司 | 定位linux内核slub内存泄漏的方法和系统 |
CN115220970A (zh) * | 2021-12-10 | 2022-10-21 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
CN115220970B (zh) * | 2021-12-10 | 2023-09-08 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
CN117112193A (zh) * | 2023-04-10 | 2023-11-24 | 荣耀终端有限公司 | 内存资源管理方法及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN110727585B (zh) | 2023-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110727585B (zh) | 内存泄漏检测方法、装置、电子设备及可读存储介质 | |
US8881107B2 (en) | Automatic memory leak detection | |
CN110716919A (zh) | 一种Mock测试方法、装置及存储介质 | |
CN108776643B (zh) | 一种基于版本控制流程的目标代码合并控制方法及系统 | |
CN108664394B (zh) | 一种内存泄露过程追溯方法及装置 | |
JP2006031109A (ja) | 管理システム及び管理方法 | |
CN111258850B (zh) | 一种基于Linux系统的更新软件信息的方法及装置 | |
CN112597028A (zh) | 一种用例测试结果的展示方法、装置及可读存储介质 | |
CN109189582B (zh) | 一种检测信号量超时原因的方法及装置 | |
CN105867962A (zh) | 系统升级的方法和装置 | |
CN112328602B (zh) | 一种数据写入Kafka的方法、装置及设备 | |
CN112685275A (zh) | 算法策略搜索方法、装置、电子设备及存储介质 | |
CN103632099A (zh) | 未导出的Native API函数获取方法及装置 | |
CN108108258B (zh) | 一种内存泄露的修复方法和装置 | |
CN107577433B (zh) | 一种存储介质和文件数据的迁移方法、装置及设备 | |
CN112214398B (zh) | 获取xmind工具中测试用例执行效率及测试效率的方法及设备 | |
CN110908610A (zh) | 一种卷回收站清理方法、装置、设备及可读存储介质 | |
CN113821193B (zh) | 一种信息生成的方法、装置和存储介质 | |
CN115237441A (zh) | 一种基于云平台的升级测试方法、装置及介质 | |
CN110866492B (zh) | 一种基线分支的识别方法、装置及计算机系统 | |
CN110221952B (zh) | 业务数据的处理方法及装置、业务数据处理系统 | |
CN113127874A (zh) | 内网敏感信息处理方法及装置 | |
CN110795334B (zh) | 一种测试装置和方法 | |
CN110928779A (zh) | 文件处理方法、应用程序运行故障定位方法和设备 | |
CN106959888B (zh) | 云存储系统中的任务处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |