发明内容
有鉴于此,本申请的目的在于提供一种内存泄露的检测方法、装置、电子设备及存储介质,能够准确确定存在内存泄露的程序。
第一方面,本申请实施例提供了一种内存泄露的检测方法,该内存泄露的检测方法包括:
按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;
根据连续n次内存对象的分配数量的变化,确定内存泄露对象;
确定内存泄露对象的使用程序;并确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;
按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;
判断已使用时长是否大于使用程序对应的最长使用时长;
若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。
在一种可能的实施方式中,根据连续n次内存对象的分配数量的变化,确定内存泄露对象,包括:
根据连续两次内存对象的分配数量,计算后一次内存对象的分配数量减去前一次内存对象的分配数量的差值;
计算所有差值的平均值,得到目标值;
若目标值大于预设阈值,则内存对象为内存泄露对象。
在一种可能的实施方式中,在根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长之前,该方法还包括:
将内存泄露对象、使用程序、使用程序对应的起始时间、使用程序对应的最长使用时长对应存储到存储表中。
在一种可能的实施方式中,在确定使用程序为内存泄露程序之前,该方法还包括:
若使用程序已经释放使用程序对应的内存泄露对象,则使用程序为无内存泄漏程序,并在存储表中删除使用程序。
在一种可能的实施方式中,该方法还包括:
确定内存泄露程序是否存在释放代码;
若不存在释放代码,则内存泄露程序确定为最终的内存泄露程序;
若存在释放代码,则内存泄露程序确定为无内存泄漏程序。
在一种可能的实施方式中,确定操作系统将内存泄露对象分配给使用程序的最长使用时长,包括:
确定使用程序的代码的运行周期;
根据运行周期,确定内存泄露对象分配给使用程序的最长使用时长;最长使用时长大于或等于运行周期。
第二方面,本申请实施例还提供了一种内存泄露的检测装置,该内存泄露的检测装置包括:
获取模块,用于按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;
确定模块,用于根据连续n次内存对象的分配数量的变化,确定内存泄露对象;
确定模块,还用于确定内存泄露对象的使用程序;
确定模块,还用于确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;
确定模块,还用于按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;
判断模块,用于判断已使用时长是否大于使用程序对应的最长使用时长;
确定模块,还用于若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。
在一种可能的实施方式中,确定模块,具体用于根据连续两次内存对象的分配数量,计算后一次内存对象的分配数量减去前一次内存对象的分配数量的差值;计算所有差值的平均值,得到目标值;若目标值大于预设阈值,则内存对象为内存泄露对象。
在一种可能的实施方式中,该装置还包括:存储模块;
存储模块,用于将内存泄露对象、使用程序、使用程序对应的起始时间、使用程序对应的最长使用时长对应存储到存储表中。
在一种可能的实施方式中,该装置还包括:删除模块;
删除模块,用于若使用程序已经释放使用程序对应的内存泄露对象,则使用程序为无内存泄漏程序,并在存储表中删除使用程序。
在一种可能的实施方式中,确定模块,还用于确定内存泄露程序是否存在释放代码;
确定模块,还用于若不存在释放代码,则内存泄露程序确定为最终的内存泄露程序;
确定模块,还用于若存在释放代码,则内存泄露程序确定为无内存泄漏程序。
在一种可能的实施方式中,确定模块,具体用于确定使用程序的代码的运行周期;根据运行周期,确定内存泄露对象分配给使用程序的最长使用时长;最长使用时长大于或等于运行周期。
第三方面,本申请实施例还提供了一种电子设备,包括:处理器、存储介质和总线,存储介质存储有处理器可执行的机器可读指令,当电子设备运行时,处理器与存储介质之间通过总线通信,处理器执行机器可读指令,以执行如第一方面任一项内存泄露的检测方法的步骤。
第四方面,本申请实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器运行时执行如第一方面任一项内存泄露的检测方法的步骤。
本申请实施例提供了一种内存泄露的检测方法、装置、电子设备及存储介质,该方法包括:按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;根据连续n次内存对象的分配数量的变化,确定内存泄露对象;确定内存泄露对象的使用程序;并确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;判断已使用时长是否大于使用程序对应的最长使用时长;若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。本申请通过内存对象的分配数量确定内存泄露对象,并为使用该内存泄露对象的使用程序确定起始时间、最长使用时长,根据使用程序使用该使用程序对应的内存泄露对象的已使用时长,确定内存泄露程序,能够准确确定存在内存泄露的程序。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请的一些实施例实现的操作。 应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。 此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。
另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
为了使得本领域技术人员能够使用本申请内容,结合特定应用场景“内存管理技术领域”,给出以下实施方式。对于本领域技术人员来说,在不脱离本申请的精神和范围的情况下,可以将这里定义的一般原理应用于其他实施例和应用场景。虽然本申请主要围绕“内存管理技术领域”进行描述,但是应该理解,这仅是一个示例性实施例。
下面对本申请实施例提供的一种内存泄露的检测方法进行详细说明。
参照图1所示,为本申请实施例提供的一种内存泄露的检测方法的流程示意图,该内存泄露的检测方法的具体执行过程为:
S101、按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量。
S102、根据连续n次内存对象的分配数量的变化,确定内存泄露对象。
S103、确定内存泄露对象的使用程序。
S104、确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长。
S105、按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长。
S106、判断已使用时长是否大于使用程序对应的最长使用时长;若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。
下面对本申请实施例示例性的各步骤进行说明:
S101、按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量。
在本申请实施方式中,在系统proc/slabinfo文件中获取操作系统已分配的多个空间大小的内存对象的分配数量。
这里,proc/slabinfo文件中存储了所有空间大小的内存对象的分配数量,内存对象包括512字节的内存对象、1024字节的内存对象等,也就是说,proc/slabinfo文件中存储了512字节的内存对象的已分配数量、1024字节的内存对象的已分配数量等。
S102、根据连续n次内存对象的分配数量的变化,确定内存泄露对象。
具体地,根据连续两次内存对象的分配数量,计算后一次内存对象的分配数量减去前一次内存对象的分配数量的差值;计算所有差值的平均值,得到目标值;若目标值大于预设阈值,则内存对象为内存泄露对象。
这里,在连续n次内存对象的分配数量中,确定所有连续两次同一个内存对象的分配数量差值,然后确定该内存对象的目标值,根据目标值确定存在内存泄露的内存对象,也就是内存泄露对象。
例如,根据连续3次内存对象的分配数量的变化,确定内存泄露对象,确定第一次512字节的内存对象和第二次512字节的内存对象的差值a1,第一次1024字节的内存对象和第二次1024字节的内存对象的差值a2;确定第二次512字节的内存对象和第三次512字节的内存对象的差值b1,第二次1024字节的内存对象和第三次1024字节的内存对象的差值b2;然后确定512字节的内存对象的目标值为(a1+a2)/2,确定1024字节的内存对象的目标值为(b1+b2)/2;将目标值大于预设阈值的字节对象确定为内存泄露对象。
S103、确定内存泄露对象的使用程序。
在本申请实施方式中,在确定了内存泄露对象后,确定操作系统把该内存泄露对象分配给了哪些实用程序。
S104、确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长。
在本申请实施方式中,确定操作系统将内存泄露对象分配给使用程序的起始时间,最长使用时长。
这里,所述最长使用时长为所述使用程序使用所述内存泄露对象的最长时长。
具体地,确定使用程序的代码的运行周期;根据运行周期,确定内存泄露对象分配给使用程序的最长使用时长;最长使用时长大于或等于运行周期。
在本申请实施方式中,根据使用程序的具体代码,确定该代码的运行周期,然后确定内存泄露对象分配给使用程序的最长使用时长,使最长使用时长大于或等于使用程序的运行周期。
这里,多次运行该使用程序,确定该使用程序的代码在每一次运行的运行完成时长,将多次运行完成时长的平均值确定为该使用程序最终的运行完成时长,考虑一定的运行波动的情况下,将最终的运行完成时长的n倍作为该使用程序的运行周期。
其中,n值不做具体限定,可以预设为任一数值。
例如,多次运行完成时长分别为2s、3s、4s,则多次运行完成时长的平均值为3s,则该使用程序的运行周期为3n。
进一步地,将内存泄露对象、使用程序、使用程序对应的起始时间、使用程序对应的最长使用时长对应存储到存储表中。
S105、按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长。
在本申请实施方式中,按照第二预设时间间隔,确定存储表中每一个使用程序使用该使用程序对应的内存泄露对象的已使用时长。
这里,将当前使用时间与使用程序对应的起始时间的时间差,作为使用程序使用该使用程序对应的内存泄露对象的已使用时长。
S106、判断已使用时长是否大于使用程序对应的最长使用时长;若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。
在本申请实施方式中,判断已使用时长是否大于最长使用时长,若已使用时长大于使用程序对应的最长使用时长,判断使用程序是否已经释放使用程序对应的内存泄露对象;否则,使用程序为无内存泄漏程序。
进一步地,若使用程序已经释放使用程序对应的内存泄露对象,使用程序为无内存泄漏程序,并在存储表中删除所述使用程序。若使用程序没有释放使用程序对应的内存泄露对象,确定使用程序为内存泄露程序。
这里,判断使用程序是否已经释放使用程序对应的内存泄露对象,是为了防止因为存储表更新不及时,误以为该使用程序的已使用时长大于使用程序对应的最长使用时长。
本申请实施例提供了一种内存泄露的检测方法,该方法包括:按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;根据连续n次内存对象的分配数量的变化,确定内存泄露对象;确定内存泄露对象的使用程序;并确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;判断已使用时长是否大于最长使用时长;若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。本申请通过内存对象的分配数量确定内存泄露对象,并为使用该内存泄露对象的使用程序确定起始时间、最长使用时长,根据使用程序使用该使用程序对应的内存泄露对象的已使用时长,确定内存泄露程序,能够准确确定存在内存泄露的程序。
参照图2所示,为本申请实施例提供的另一种内存泄露的检测方法的流程示意图,下面对本申请实施例示例性的各步骤进行说明:
S201、确定内存泄露程序是否存在释放代码;若不存在释放代码,则内存泄露程序确定为最终的内存泄露程序。
S202、若存在释放代码,则内存泄露程序确定为无内存泄漏程序。
本申请实施例提供了另一种内存泄露的检测方法,通过确定内存泄露程序是否存在释放代,进一步确定该内存泄露程序是否存在内存泄露,使本申请在检测内存泄漏时更准确。
参照图3所示,为本申请实施例提供的一种内存泄露的检测装置的示意图,该内存泄露的检测装置包括:
获取模块301,用于按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;
确定模块302,用于根据连续n次内存对象的分配数量的变化,确定内存泄露对象;
确定模块302,还用于确定内存泄露对象的使用程序;
确定模块302,还用于确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;
确定模块302,还用于按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;
判断模块303,用于判断已使用时长是否大于使用程序对应的最长使用时长;
确定模块302,还用于若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。
在一种可能的实施方式中,确定模块302,具体用于根据连续两次内存对象的分配数量,计算后一次内存对象的分配数量减去前一次内存对象的分配数量的差值;计算所有差值的平均值,得到目标值;若目标值大于预设阈值,则内存对象为内存泄露对象。
在一种可能的实施方式中,该装置还包括:存储模块304;
存储模块304,用于将内存泄露对象、使用程序、使用程序对应的起始时间、使用程序对应的最长使用时长对应存储到存储表中。
在一种可能的实施方式中,该装置还包括:删除模块305;
删除模块305,用于若使用程序已经释放使用程序对应的内存泄露对象,则使用程序为无内存泄漏程序,并在存储表中删除使用程序。
在一种可能的实施方式中,确定模块302,还用于确定内存泄露程序是否存在释放代码;
确定模块302,还用于若不存在释放代码,则内存泄露程序确定为最终的内存泄露程序;
确定模块302,还用于若存在释放代码,则内存泄露程序确定为无内存泄漏程序。
在一种可能的实施方式中,确定模块302,具体用于确定使用程序的代码的运行周期;根据运行周期,确定内存泄露对象分配给使用程序的最长使用时长;最长使用时长大于或等于运行周期。
本申请实施例提供了一种内存泄露的检测装置,该装置包括:获取模块301,用于按照第一预设时间间隔,获取操作系统已分配的多个空间大小的内存对象的分配数量;确定模块302,用于根据连续n次内存对象的分配数量的变化,确定内存泄露对象;确定模块302,还用于确定内存泄露对象的使用程序;确定模块302,还用于确定操作系统将内存泄露对象分配给使用程序的起始时间、最长使用时长;最长使用时长为使用程序使用内存泄露对象的最长时长;确定模块302,还用于按照第二预设时间间隔,根据使用程序对应的起始时间,确定使用程序使用该使用程序对应的内存泄露对象的已使用时长;判断模块303,用于判断已使用时长是否大于最长使用时长;确定模块302,还用于若已使用时长大于使用程序对应的最长使用时长,则确定使用程序为内存泄露程序。本申请通过内存对象的分配数量确定内存泄露对象,并为使用该内存泄露对象的使用程序确定起始时间、最长使用时长,根据使用程序使用该使用程序对应的内存泄露对象的已使用时长,确定内存泄露程序,能够准确确定存在内存泄露的程序。
如图4所示,本申请实施例提供的一种电子设备400,包括:处理器401、存储器402和总线,存储器402存储有处理器401可执行的机器可读指令,当电子设备运行时,处理器401与存储器402之间通过总线通信,处理器401执行机器可读指令,以执行如上述内存泄露的检测方法的步骤。
具体地,上述存储器402和处理器401能够为通用的存储器和处理器,这里不做具体限定,当处理器401运行存储器402存储的计算机程序时,能够执行上述内存泄露的检测方法。
对应于上述内存泄露的检测方法,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述内存泄露的检测方法的步骤。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考方法实施例中的对应过程,本申请中不再赘述。在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述信息处理方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。