CN107102922B - 内存检测方法、装置及电子设备 - Google Patents
内存检测方法、装置及电子设备 Download PDFInfo
- Publication number
- CN107102922B CN107102922B CN201710214510.2A CN201710214510A CN107102922B CN 107102922 B CN107102922 B CN 107102922B CN 201710214510 A CN201710214510 A CN 201710214510A CN 107102922 B CN107102922 B CN 107102922B
- Authority
- CN
- China
- Prior art keywords
- instance
- memory
- instances
- application program
- determining
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2205—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2273—Test methods
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供一种内存检测方法、装置及电子设备,其中,方法包括:当监测到应用程序在运行过程中占用的内存需要检测时,确定与所述应用程序相关的第一实例集合;基于所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存泄漏的第二实例集合;基于所述第二实例集合中每一个实例的路径信息,生成关于所述应用程序出现内存泄漏的检测结果。本申请技术方案可以通过第二实例集合中的每一个实例的路径信息对应用程序出现内存泄漏的问题进行实时分析,便于查找造成应用程序出现内存泄漏的原因,使测试人员根据检测结果快速定位出现内存泄漏的位置,进而可改进出现内存泄漏的代码,提高应用程序的稳定性。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存检测方法、装置及电子设备。
背景技术
在应用程序实际的运行过程中,导致内存溢出的因素很多,例如,技术人员由于疏忽或错误造成应用程序未能释放已经不再使用的内存,可能会出现内存泄漏,而内存泄漏会导致内存溢出。对于应用程序已经发布上线的情形,线上环境出现的内存溢出问题通常由于线上环境复杂,技术人员难以通过线下复现的方式排查线上环境导致内存溢出的原因。
发明内容
有鉴于此,本申请提供一种新的技术方案,可以利用电子设备有限的内存资源对应用程序出现内存泄漏的问题进行实时分析。
为实现上述目的,本申请提供技术方案如下:
根据本申请的第一方面,提出了一种内存检测方法,包括:
当监测到应用程序在运行过程中占用的内存需要检测时,确定与所述应用程序相关的第一实例集合;
基于所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存泄漏的第二实例集合;
基于所述第二实例集合中每一个实例的路径信息,生成关于所述应用程序出现内存泄漏的检测结果。
根据本申请的第二方面,提出了一种内存检测装置,包括:
第一确定单元,用于当监测到应用程序在运行过程中占用的内存需要检测时,确定与所述应用程序相关的第一实例集合;
第二确定单元,用于基于所述第一确定单元确定的所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存泄漏的第二实例集合;
检测结果生成单元,用于基于所述第二确定单元确定的所述第二实例集合中每一个实例的路径信息,生成关于所述应用程序出现内存泄漏的检测结果。
根据本申请的第三方面,提出了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述第一方面提出的内存检测方法。
根据本申请的第四方面,提出了一种电子设备,所述电子设备包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述第一方面提供的内存检测方法。
由以上技术方案可见,由于第二实例集合中包含的实例的数量远远小于堆内存中的实例的数量,因此可以确保在复杂的线上环境中,利用电子设备有限的内存资源,通过第二实例集合中的每一个实例的路径信息对应用程序出现内存泄漏的问题进行实时分析,便于查找造成应用程序出现内存溢出的原因,使测试人员根据检测结果快速定位出现内存溢出的位置,进而可改进出现内存溢出的代码,提高应用程序的稳定性。
附图说明
图1是本申请一示例性实施例示出的内存检测方法的流程示意图;
图2是本申请另一示例性实施例示出的内存检测方法的流程示意图;
图3A是本申请再一示例性实施例示出的内存检测方法的流程示意图;
图3B是图3A所示实施例中的实例的路径示意图;
图3C是经过图3A所示实施例合并实例之后的示意图;
图4A是本申请再一示例性实施例示出的内存检测方法的流程示意图;
图4B是图4A所示实施例中的第二实例集合的示意图;
图4C是图4A所示实施例中对第二实例集合进行扩容的示意图;
图4D是图4A所示实施例中对第二实例集合进行置换的示意图;
图5A是本申请又一示例性实施例示出的内存检测方法的流程示意图;
图5B是图5A所示实施例中应用程序在运行过程中的内存值的示意图;
图5C是图5A所示实施例中的波谷点的示意图;
图6是本申请一示例性实施例示出的内存检测装置的结构示意图;
图7是本申请另一示例性实施例示出的内存检测装置的结构示意图;
图8是本申请一示例性实施例示出的电子设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本申请涉及到的基础定义:
实例:是根据类创建出来的一个个具体的“对象”。
实例属性:包括实例自身的信息以及与实例相关的信息,实例自身的信息可包括:实例的名称、实例本身大小(shallowSize)、实例被回收可释放的总内存大小(retainsize)、用于查找泄漏路径信息(mHardReferences)等,与实例相关的信息可包括:实例的直接掌控者(mImmediateDominator)的信息,也可以理解为父实例的信息,例如,父实例的名称、序列号(ID)以及大小等。
内存泄露:也称作“存储渗漏”,用动态存储分配函数动态开辟的内存空间,在该内存空间使用完毕后未释放而一直被占据,直到程序结束。
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用。
图1是本申请一示例性实施例示出的内存检测方法的流程示意图;本申请可以应用在电子设备上,通过开发第三方程序或者第三方库的方式实现,当应用程序接入到该第三方程序或者第三方库时,通过第三方程序或者第三方库检测应用程序在运行过程中占用的内存,如图1所示,包括如下步骤:
步骤101,当监测到应用程序在运行过程中占用的内存需要检测时,确定与应用程序相关的第一实例集合。
在一实施例中,可通过应用程序的内存的快照文件获取与应用程序相关的第一实例集合,例如,在应用程序运行过程中,通过dump命令生成hprof文件,解析hprof文件得到快照文件,从快照文件中确定与应用程序相关的堆内存(Heap)。在堆内存中包括与该应用程序相关的大量实例,每个实例具有实例名称、本身大小(shallowSize)和被回收可释放的总内存大小(retainSize)等属性。
进一步地,在解析hprof文件的过程中,可存储已解析的实例以及记录已解析的实例的名称以及实例本身大小,将当前正在解析的实例的名称与已存储的实例的实例名称以及实例本身大小进行比较,若已存储的具有相同实例名称并且具有相同本身大小的实例的数量等于第一预设阈值,可以在后续解析过程中将与该实例名称相同并且具有相同本身大小的实例丢弃,从而可以将相同名称并且具有相同本身大小的实例的数量控制在第一预设阈值以内,确保本申请在检测内存泄漏时占用较少的内存。
步骤102,基于第一实例集合中每一个实例占用的内存值,从第一实例集合中确定用于分析应用程序出现内存泄漏的第二实例集合。
与上述步骤101的描述相对应,在步骤102中,可以先统计第一实例集合中的具有相同实例名称并且具有相同大小的实例,得到多个实例组,其中,多个实例组中的每一个实例组包括至少一个实例;对每一个实例组中的实例的内存值进行加和,得到多个实例组各自对应的内存和值;基于多个实例组各自对应的内存和值,对实例组按照预设顺序进行排序;基于内存和值由大到小的顺序,确定排在前设定位数的实例组,排在前设定位数的实例组形成用于分析应用程序出现内存泄漏的第二实例集合。在一实施例中,每一个实例组中可以包括多个具有相同实例名称并且大小相同的实例,例如,实例“ABC1”和实例“ABC2”为实例名称相同并且大小相同,则可以为被统计到一个实例组中;实例“ABC3”和实例“ABC4”为实例名称相同并且大小相同,实例“ABC1”与实例“ABC3”为实例名称相同但大小不相同,则实例“ABC3”和实例“ABC4”可被统计到另一个实例组中;实例“ABC1”和实例“BCD2”为名称不同的实例,则可以需要被统计不同的实例组中。
在一实施例中,每一个实例组中的实例的内存值可以为实例被回收可释放的总内存大小(retainsize)。
在一实施例中,可以基于第一实例集合中每一个实例占用的内存值大小,通过堆排序法、快速排序法、冒泡排序法等,将第一实例集合中的实例按照占用的内存值以预设顺序(例如,由大到小或者由小到大)排序,例如,当由大到小排序时,从第二实例集合中确定出大小排在前设定位数的实例,该排在前设定位数的实例可视为本申请中的第二实例集合,当由小到大排序时,从第二实例集合中确定出大小排在后设定位数的实例,该排在后设定位数的实例可视为本申请中的第二实例集合。
步骤103,基于第二实例集合中每一个实例的路径信息,生成关于应用程序出现内存泄漏的检测结果。
在一实施例中,路径信息表示每一个实例到垃圾回收器中的根对象(GCroot)所经过的所有父实例的信息,父实例的信息可包括父实例的名称、父实例被回收可释放的总内存大小(retainSize)等,其中一个实例的路径信息例如:
*GC ROOT thread java.lang.Thread.<Java Local>(named'Thread name notavailable')
*references java.util.ArrayList.array
*references array java.lang.Object[].[0]
*leaks com.amap.api.col.aj$a。
本领域技术人员可以理解的是,同一个应用程序中可包含多个根对象(GC root),因此不同的实例可能对应不同的根对象。
现举例说明本实施例:例如,当监测到应用程序在运行过程中占用的内存需要检测时,若通过dump命令生成的hprof文件中包含有20万个实例,通过步骤101的描述可以从这20万个实例中,统计出具有相同名称以及相同本身大小的实例,并控制具有相同名称以及相同本身大小的实例的数量小于或者等于第一预设阈值,从而可以使第一实例集合中包含的实例的数量远远小于hprof文件中包含的实例的数量,例如,从这20万个实例中通过步骤101的描述得到5万个实例,则该5万个实例形成的集合即可视为本申请所述的第一实例集合。通过上述步骤202的描述可对这5万个实例进行分组,得到多个实例组(例如,500个实例组)。对这500个实例组中的每一个实例组的实例的内存值进行加和,得到每一个实例组对应的内存和值,例如,共有500个内存和值,通过对这500个内存和值进行由大到小的顺序排序,得到排在前100的实例组,则这100个实例组可视为本申请中的第二实例集合。基于这100个实例组中的每一个实例的路径信息,可生成关于应用程序出现内存泄漏的检测结果。
对于第二实例集合中的每一个实例的路径信息,组成检测结果。此外,检测结果可以通过文本的方式上报给服务器,还可以在电子设备本地通过文本的方式展示给用户。
本实施例通过上述步骤101-步骤103,由于第二实例集合中包含的实例的数量远远小于堆内存中的实例的数量,因此可以确保在复杂的线上环境中,利用电子设备有限的内存资源,通过第二实例集合中的每一个实例的路径信息对应用程序出现内存泄漏的问题进行实时分析,便于查找造成应用程序出现内存泄漏的原因,使测试人员根据检测结果快速定位出现内存泄漏的位置,进而可改进出现内存泄漏的代码,提高应用程序的稳定性。
图2是本申请另一示例性实施例示出的内存检测方法的流程示意图;本实施例在上述实施例的基础上,以如何确定与应用程序相关的第一实例集合为例进行示例性说明,如图2所示,包括如下步骤:
步骤201,当监测到应用程序在运行过程中占用的内存需要检测时,确定用于记录应用程序的内存信息的内存镜像文件。
在一实施例中,可以通过dump命令拷贝应用程序当前占用的内存信息,生成hprof文件,该hprof文件可视为本申请中的内存镜像文件。
步骤202,在解析内存镜像文件的过程中,确定第一实例集合中已记录的与当前正在解析的具有相同实例名称并且具有相同本身大小的实例的数量。
在一实施例中,名称相同的实例,由于序列号(ID)不同,可表示不同的实例,例如,实例ABC1与实例ABC2,其中,“ABC”可视为实例的名称,“1”和“2”可视为实例的序列号。例如,堆内存中有与应用程序相关的10万个实例,可以根据实例名称以及实例本身大小统计这10万个实例,找到具有相同名称并且具有相同本身大小的实例,控制具有相同名称并且具有相同本身大小的实例的数量在第一预设阈值以内。
步骤203,确定具有相同名称并且具有相同本身大小的实例的数量与第一预设阈值的大小关系,若实例的数量小于第一预设阈值,执行步骤204,若实例的数量等于第一预设阈值,执行步骤205。
在一实施例中,第一预设阈值的大小可以为万级以上,具体的数值可以根据具体应用程序的大小来确定,本申请对第一预设阈值的具体值不做限定。
步骤204,若实例的数量小于第一预设阈值,将当前正在解析的实例记录在第一实例集合中,以及,更新与当前正在解析的实例具有相同实例名称并且具有相同本身大小的实例的数量。
例如,第一预设阈值为1万,当前正在解析的实例为“ABC10”,其中,“ABC”为实例名称,“10”为实例的序列号(ID),若第一实例集合中已经记录的实例名称为“ABC”并且具有相同本身大小的实例的总数量为9990,则可以将实例“ABC10”记录在第一实例集合中,并将第一实例集合中的具有实例名称为“ABC”的实例的数量更新为9991。
步骤205,若实例的数量等于第一预设阈值,将当前正在解析的实例记录在第三实例集合。
与上述步骤204相对应,若第一实例集合中已经记录的实例名称为“ABC”并且具有相同本身大小的实例的总数量为1万个,则可以将实例“ABC10”记录在第三实例集合中,从而将第一实例集合关于实例名称为“ABC”并具有相同本身大小的实例的数量控制在1万个以内。
本实施例中,通过将第一实例集合中具有相同实例名称并且具有相同大小的实例的数量控制在第一预设阈值,可以控制本申请在分析应用程序的进程在内存中的占用比例,从而确保本申请能够在应用程序运行过程中分析应用程序的内存泄漏,降低由于分析内存泄漏所消耗的内存资源。
图3A是本申请再一示例性实施例示出的内存检测方法的流程示意图,图3B是图3A所示实施例中的实例的路径示意图,图3C是经过图3A所示实施例合并实例之后的示意图;本实施例在上述实施例的基础上,以如何调整第二实例集合为例进行示例性说明,如图3A所示,包括如下步骤:
步骤301,根据实例名称、该实例对应的父实例的名称,对与应用程序相关的并且未记录在第二实例集合中的实例进行路径合并。
在一实施例中,与应用程序相关的并且未记录在第二实例集合中的实例,既可以包括在上述图1所示实施例中与应用程序相关的堆内存中的大量实例中未记录在第一实例集合中的实例,也可以包括上述图2所示实施例中的第三实例集合中的实例。
步骤302,当合并后的实例的内存值符合预设条件时,将合并后的实例添加到第二实例集合中。
应用程序在运行过程中可能是由于不断进入新界面,退出该新界面,再进入该新界面,再退出该新界面等反复操作造成小对象导致内存泄露,这些小对象在堆内存中通过快照解析后成为不同的实例,并且这些小对象自身不会占用太大的内存,并分属于不同的垃圾回收器(GC)路径(也可称为链路),其中,GC root表示内存中不可以被回收的实例,例如,若整条路径上的根节点为垃圾回收器的根对象,则该条路径在内存使用过程中无法被回收。
如图3B所示,由于反复操作实例B1、实例B2、实例B3造成了内存泄漏,而泄漏的路径互不相同,例如,对于实例B1而言,到垃圾回收器的根对象(GC roots)的路径为B1-A1-根对象,对于实例B2而言,到垃圾回收器的根对象(GC roots)的路径为B2-A2-根对象,对于实例B3而言,到垃圾回收器的根对象(GC roots)的路径为B3-A3-根对象。实例B1、实例B2、实例B3通过不同的路径,汇聚到相同的祖辈节点(GC roots),因此可以将这三个小实例合并,也即,将同一级的实例合并为一个实例,合并后的实例如图3C所示,在合并同一级节点的实例的过程中,需要将同一级节点的实例的内存值(可以为实例被回收可释放的总内存大小(retainsize))进行加和,由此可提高该条路径上的实例的内存值所占的比重。
在一实施例中,预设条件的具体描述可以参见下述图4A所示实施例的相关描述,在此先不详述。
本实施例中,通过将排在前设定位数的合并后的实例记录在第二实例集合中,从而可确保由小对象导致的内存泄漏被及时查找到。
图4A是本申请再一示例性实施例示出的内存检测方法的流程示意图,图4B是图4A所示实施例中的第二实例集合的示意图,图4C是图4A所示实施例中对第二实例集合进行扩容的示意图,图4D是图4A所示实施例中对第二实例集合进行置换的示意图;本实施例在上述实施例的基础上,以如何调整第二实例集合为例进行示例性说明,如图4A所示,包括如下步骤:
步骤401,将与应用程序相关的并且未记录在第二实例集合中的每一个实例的内存值与第二预设阈值进行比较,若内存值大于第二预设阈值,执行步骤402,若内存值小于第二预设阈值,执行步骤403。
步骤402,将内存值大于第二预设阈值的实例添加到第二实例集合中,执行图1所示实施例中的步骤403,流程结束。
步骤403,对与应用程序相关的并且未记录在第二实例集合中的内存值小于第二预设阈值的实例,将小于第二预设阈值的内存值与第二实例集合中实例对应的最小内存值进行比较。
步骤404,若小于第二预设阈值的内存值大于最小内存值,则在第二实例集合中,将最小内存值对应的实例置换成小于第二预设阈值的内存值对应的实例,执行图1所示实施例中的步骤103,流程结束。
在步骤403和步骤404中,为防止第二实例集合中包含的实例的数量较多导致一些可疑的实例没有添加到第二实例集合中的情形,可以将与应用程序相关的并且未记录在第二实例集合中的实例的内存值与第二预设阈值进行比较,对于内存值大于第二预设阈值的实例,则可对第二实例集合的容量加一,同时将该实例添加到第二实例集合中;对与应用程序相关的并且未记录在第二实例集合中的内存值小于第二预设阈值的实例,可继续按照排序规则(例如,堆排序),将与应用程序相关的并且未记录在第二实例集合中的实例的内存值与第二实例中的最小内存值进行比较,若与应用程序相关的并且未记录在第二实例集合中的实例的内存值大于第二实例集合中的最小内存值,则将第二实例集合中的与最小内存值对应的实例置换成与应用程序相关的并且未记录在第二实例集合中的内存值大于第二实例集合中的最小内存值的实例。如图4B所示,第二实例集合32包括实例1-实例10。如图4C所示,可将与应用程序相关的并且未记录在第二实例集合中的实例视为一个集合31,对于集合31中的一个实例A,将实例A的内存值与第二预设阈值进行比较,若实例A的内存值大于第二预设阈值,则可以将实例A添加到第二实例集合32中。如图4D所示,若实例A的内存值小于第二预设阈值,则将实例A的内存值与第二实例集合32中的最小内存值(例如,编号为7的实例对应的内存值)进行比较,例如,第二实例集合中编号为7的实例的内存值为最小值,若实例A的内存值小于实例7的内存值,则可以将实例A丢弃,若实例A的内存值大于实例7的内存值,则可以将实例7替换成实例A。
在一实施例中,第二预设阈值可以由内存镜像文件大小以及一个预设百分比来确定,例如,内存镜像文件的大小为100M,则第二预设阈值为100M的5%,6%,等等。需要说明的是,5%以及6%为示例性说明,其不能形成对本申请的限制。
本实施例中,通过将与应用程序相关的并且未记录在第二实例集合中的实例对第二实例集合进行扩容,可以防止第二实例集合中包含的实例的数量较多导致一些可疑的实例没有添加到第二实例集合中的情形,由于本实施例是通过导致内存泄漏的直接原因得到的第二实例集合,即实例本身被回收可释放的总内存较大,或者是反复操作不断产生泄漏,相比现有技术中的预先定义需要怀疑内存泄露的对象集合会出现定义不准确的缺陷,本实施例的通用性更强。
图5A是本申请又一示例性实施例示出的内存检测方法的流程示意图,图5B是图5A所示实施例中应用程序在运行过程中的内存值的示意图,图5C是图5A所示实施例中的波谷点的示意图;本实施例在上述实施例的基础上,以如何监测应用程序在运行过程中占用的内存是否需要检测为例进行示例性说明,如图5A所示,包括如下步骤:
步骤501,当监测到应用程序在运行过程中占用的内存值高于第三预设阈值时,连续采样应用程序的内存值,得到N个采样点,其中,N为正整数。
在一实施例中,第三预设阈值可以由应用程序正常运行时达到的最大值来确定,本申请对第三预设阈值的具体大小不做限制。如图5B所示,为应用程序在运行过程中的内存值的动态示意图,其中水平方向为时间,竖直方向为内存值的大小,通过图5B可知在应用程序运行过程中,应用程序占用的内存值随着时间会动态变化,其中的箭头指向的点为本申请中所述波谷点。
步骤502,确定N个采样点中的M个波谷点,其中,M为正整数,并且M<N。
如图5C所示,波谷点可以视为内存值动态变化曲线中的凹点。
步骤503,对M个波谷点进行曲线拟合,基于曲线拟合的结果确定应用程序的内存值的变化趋势。
在一实施例中,可以通过现有技术中的拟合算法(例如,多项式函数拟合算法、最小二乘法拟合算法)等拟合出该M个波谷点对应的曲线图,通过曲线图来确定内存值的变化趋势。在一实施例中,内存值的变化趋势可以包括上升趋势和下降趋势,若为下降趋势,表明应用程序的内存消耗在降低,应用程序不会出现内存溢出的情形,若为上升趋势,表明应用程序中可能存在未释放并且已经不再使用的内存。
步骤504,当变化趋势为上升趋势时,确定应用程序占用的内存需要检测。
在一实施例中,可以提示应用程序存在内存泄漏的风险,并启动执行上述图1所示实施例的方法流程,及时检测应用程序是否存在内存泄露。
本实施例中,通过对波谷点进行曲线拟合,当拟合得到的曲线呈现上升趋势时,判断出应用程序出现内存泄漏,由于连续内存值的波谷点更能真实反映应用程序的内存实际使用情况,因此本实施例能够更准确地判断内存泄漏的风险。
与前述内存检测方法的实施例相对应,本申请还提供了内存检测装置的实施例。
图6是本申请一示例性实施例示出的内存检测装置的结构示意图,如图6,内存检测装置可包括:第一确定单元61、第二确定单元62、检测结果生成单元63;其中,
第一确定单元61,用于当监测到应用程序在运行过程中占用的内存需要检测时,确定与应用程序相关的第一实例集合;
第二确定单元62,用于基于第一确定单元61确定的第一实例集合中每一个实例占用的内存值,从第一实例集合中确定用于分析应用程序出现内存泄漏的第二实例集合;
检测结果生成单元63,用于基于第二确定单元62确定的第二实例集合中每一个实例的路径信息,生成关于应用程序出现内存泄漏的检测结果。
图7是本申请另一示例性实施例示出的内存检测装置的结构示意图,如图7所示,在上述图6所示实施例的基础上,第一确定单元61可包括:
第一确定子单元611,用于确定用于记录应用程序的内存信息的内存镜像文件;
第二确定子单元612,用于在解析第一确定子单元611确定的内存镜像文件的过程中,确定第一实例集合中已记录的与当前正在解析的具有相同实例名称并且具有相同大小的实例的数量;
第一记录子单元613,用于若第二确定子单元612确定的实例的数量小于第一预设阈值,将当前正在解析的实例记录在第一实例集合中,以及,更新与当前正在解析的实例具有相同实例名称并且具有相同大小的实例的数量;
第二记录子单元614,用于若第二确定子单元612确定的实例的数量等于第一预设阈值,将当前正在解析的实例记录在第三实例集合中。
在一实施例中,第二确定单元62可包括:
路径合并子单元621,用于在检测结果生成单元63生成关于应用程序出现内存泄漏的检测结果之前,根据实例名称、该实例对应的父实例的名称,对与所述应用程序相关的并且未记录在第二实例集合中的实例进行路径合并;
第一添加子单元622,用于当路径合并子单元621合并后的实例的内存值符合预设条件时,将合并后的实例添加到第二实例集合中。
在一实施例中,第二确定单元62还可包括:
比较子单元623,用于在检测结果生成单元63生成关于所述应用程序出现内存泄漏的检测结果之前,将与应用程序相关的并且未记录在第二实例集合中的每一个实例的内存值与第二预设阈值进行比较;
第二添加子单元624,用于将比较子单元623比较的内存值大于第二预设阈值的实例添加到第二实例集合中。
在一实施例中,内存检测装置还可包括:
比较单元64,用于在比较子单元623将与应用程序相关的并且未记录在第二实例集合中的每一个实例的内存值与第二预设阈值进行比较之后,对内存值小于第二预设阈值的第三实例集合中的实例,将小于第二预设阈值的内存值与第二实例集合对应的最小内存值进行比较;
实例置换单元65,用于若比较单元64比较的结果表示小于第二预设阈值的内存值大于最小内存值,则在第二实例集合中,将最小内存值对应的实例置换成小于预设阈值的内存值对应的实例。
在一实施例中,第二确定单元62还可包括:
统计子单元625,用于统计第一实例集合中的具有相同实例名称并且具有相同大小的实例,得到多个实例组,多个实例组中的每一个实例组包括至少一个实例;
加和子单元626,用于对统计子单元625统计出的每一个实例组中的实例的内存值进行加和,得到多个实例组各自对应的内存和值;
排序子单元627,用于基于加和子单元626得到的多个实例组各自对应的内存和值,对实例组按照预设顺序进行排序;
第三确定子单元628,用于基于排序子单元627对内存和值由大到小的顺序,确定排在前设定位数的实例组,排在前设定位数的实例组形成用于分析应用程序出现内存泄漏的第二实例集合。
在一实施例中,内存检测装置还可包括:
采样单元66,用于当监测到应用程序在运行过程中占用的内存值高于第三预设阈值时,连续采样应用程序的内存值,得到N个采样点,其中,N为正整数;
第三确定单元67,用于确定采样单元66采样得到的N个采样点中的M个波谷点,其中,M为正整数,并且M<N;
曲线拟合单元68,用于对第三确定单元67确定的M个波谷点进行曲线拟合,基于曲线拟合的结果确定应用程序的内存值的变化趋势;
第四确定单元69,用于若变化趋势为上升趋势,确定应用程序占用的内存需要检测,第一确定单元61执行确定与应用程序相关的第一实例集合的步骤。
本申请内存检测装置的实施例可以应用在电子设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在电子设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图8所示,为本申请内存检测装置所在电子设备的一种硬件结构图,除了图8所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的电子设备通常根据该电子设备的实际功能,还可以包括其他硬件,对此不再赘述。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (11)
1.一种内存检测方法,其特征在于,所述方法包括:
当监测到应用程序在运行过程中占用的内存需要检测时,确定与所述应用程序相关的第一实例集合;
基于所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存泄漏的第二实例集合;
基于所述第二实例集合中每一个实例的路径信息,生成关于所述应用程序出现内存泄漏的检测结果;
所述确定与所述应用程序相关的第一实例集合,包括:
确定用于记录所述应用程序的内存信息的内存镜像文件;
在解析所述内存镜像文件的过程中,确定第一实例集合中已记录的与当前正在解析的具有相同实例名称并且具有相同大小的实例的数量;
若所述实例的数量小于第一预设阈值,将所述当前正在解析的实例记录在所述第一实例集合中,以及,更新与所述当前正在解析的实例具有相同实例名称并且具有相同大小的实例的数量。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述实例的数量等于所述第一预设阈值,将所述当前正在解析的实例记录在第三实例集合中。
3.根据权利要求1所述的方法,其特征在于,所述生成关于所述应用程序出现内存泄漏的检测结果的步骤之前,所述方法还包括:
根据实例名称、该实例对应的父实例的名称,对与所述应用程序相关的并且未记录在所述第二实例集合中的实例进行路径合并;
当所述合并后的实例的内存值符合预设条件时,将所述合并后的实例添加到所述第二实例集合中。
4.根据权利要求1所述的方法,其特征在于,所述生成关于所述应用程序出现内存泄漏的检测结果的步骤之前,所述方法还包括:
将与所述应用程序相关的并且未记录在所述第二实例集合中的每一个实例的内存值与第二预设阈值进行比较;
将内存值大于所述第二预设阈值的实例添加到所述第二实例集合中。
5.根据权利要求4所述的方法,其特征在于,所述将与应用程序相关的并且未记录在所述第二实例集合中的每一个实例的内存值与第二预设阈值进行比较的步骤之后,所述方法还包括:
对于与所述应用程序相关的并且未记录在所述第二实例集合中的内存值小于所述第二预设阈值的实例,将小于所述第二预设阈值的内存值与所述第二实例集合中实例对应的最小内存值进行比较;
若小于所述第二预设阈值的内存值大于所述最小内存值,则在所述第二实例集合中,将所述最小内存值对应的实例置换成所述小于所述第二预设阈值的内存值对应的实例。
6.根据权利要求1所述的方法,其特征在于,所述基于所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存溢出的第二实例集合,包括:
统计所述第一实例集合中的具有相同实例名称并且具有相同大小的实例,得到多个实例组,所述多个实例组中的每一个实例组包括至少一个实例;
对所述每一个实例组中的实例的内存值进行加和,得到所述多个实例组各自对应的内存和值;
基于所述多个实例组各自对应的内存和值,对所述实例组按照预设顺序进行排序;
基于内存和值由大到小的顺序,确定排在前设定位数的实例组,所述排在前设定位数的实例组形成用于分析所述应用程序出现内存泄漏的第二实例集合。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当监测到所述应用程序在运行过程中占用的内存值高于第三预设阈值时,连续采样所述应用程序的内存值,得到N个采样点,其中,N为正整数;
确定所述N个采样点中的M个波谷点,其中,M为正整数,并且M<N;
对所述M个波谷点进行曲线拟合,基于所述曲线拟合的结果确定所述应用程序的内存值的变化趋势;
若所述变化趋势为上升趋势,确定所述应用程序占用的内存需要检测。
8.一种内存检测装置,其特征在于,所述装置包括:
第一确定单元,用于当监测到应用程序在运行过程中占用的内存需要检测时,确定与所述应用程序相关的第一实例集合;
第二确定单元,用于基于所述第一确定单元确定的所述第一实例集合中每一个实例占用的内存值,从所述第一实例集合中确定用于分析所述应用程序出现内存泄漏的第二实例集合;
检测结果生成单元,用于基于所述第二确定单元确定的所述第二实例集合中每一个实例的路径信息,生成关于所述应用程序出现内存泄漏的检测结果;
所述第一确定单元包括:
第一确定子单元,用于确定用于记录所述应用程序的内存信息的内存镜像文件;
第二确定子单元,用于在解析所述第一确定子单元确定的所述内存镜像文件的过程中,确定第一实例集合中已记录的与当前正在解析的具有相同实例名称并且具有相同大小的实例的数量;
第一记录子单元,用于若所述第二确定子单元确定的所述实例的数量小于第一预设阈值,将所述当前正在解析的实例记录在所述第一实例集合中,以及,更新与所述当前正在解析的实例具有相同实例名称并且具有相同大小的实例的数量。
9.根据权利要求8所述的装置,其特征在于,所述第一确定单元包括:
第二记录子单元,用于若所述第二确定子单元确定的实例的数量等于所述第一预设阈值,将所述当前正在解析的实例记录在第三实例集合中。
10.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机程序,所述计算机程序用于执行上述权利要求1-7任一所述的内存检测方法。
11.一种电子设备,其特征在于,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述权利要求1-7任一所述的内存检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710214510.2A CN107102922B (zh) | 2017-04-01 | 2017-04-01 | 内存检测方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710214510.2A CN107102922B (zh) | 2017-04-01 | 2017-04-01 | 内存检测方法、装置及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107102922A CN107102922A (zh) | 2017-08-29 |
CN107102922B true CN107102922B (zh) | 2020-08-07 |
Family
ID=59674863
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710214510.2A Active CN107102922B (zh) | 2017-04-01 | 2017-04-01 | 内存检测方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107102922B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111274057B (zh) * | 2020-01-13 | 2021-07-06 | 北京字节跳动网络技术有限公司 | 一种内存泄露链路的处理方法、装置、介质和电子设备 |
CN113296923B (zh) * | 2020-04-17 | 2023-12-19 | 阿里巴巴集团控股有限公司 | 内存合并方法、设备以及计算机可读介质 |
CN112035314B (zh) * | 2020-07-31 | 2024-04-30 | 北京达佳互联信息技术有限公司 | 内存泄漏的监控方法、装置及电子设备 |
CN111949528A (zh) * | 2020-08-05 | 2020-11-17 | 北京字节跳动网络技术有限公司 | 内存泄漏的检测方法、装置、电子设备和存储介质 |
CN111897559B (zh) * | 2020-08-06 | 2022-08-26 | 厦门美图之家科技有限公司 | 热更新代码检测方法、装置、电子设备及存储介质 |
CN111966603B (zh) * | 2020-09-04 | 2024-01-19 | 网易(杭州)网络有限公司 | 内存泄露的检测方法及装置、可读存储介质及电子设备 |
CN112181774A (zh) * | 2020-09-29 | 2021-01-05 | 新华三信息技术有限公司 | 一种系统资源监测方法、装置、设备及机器可读存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100504811C (zh) * | 2007-06-13 | 2009-06-24 | 中兴通讯股份有限公司 | 一种检测内存泄露的方法 |
CN101539870A (zh) * | 2008-03-21 | 2009-09-23 | 中兴通讯股份有限公司 | 内存泄漏检测装置及方法 |
CN102053868B (zh) * | 2009-11-04 | 2016-08-10 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN101908018B (zh) * | 2010-07-20 | 2012-09-26 | 北京海泰方圆科技有限公司 | 一种判断内存泄露的系统及方法 |
CN103714004A (zh) * | 2014-01-02 | 2014-04-09 | 金蝶软件(中国)有限公司 | Jvm在线内存泄露分析方法及系统 |
CN104536785B (zh) * | 2014-12-23 | 2018-04-06 | 北京国双科技有限公司 | 实时系统更新方法及装置 |
CN106502880B (zh) * | 2016-09-20 | 2019-05-17 | 东软集团股份有限公司 | 一种内存泄漏调试方法及装置 |
-
2017
- 2017-04-01 CN CN201710214510.2A patent/CN107102922B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107102922A (zh) | 2017-08-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107102922B (zh) | 内存检测方法、装置及电子设备 | |
US9921948B2 (en) | Software commit risk level | |
Cotroneo et al. | Predicting aging-related bugs using software complexity metrics | |
US20060212852A1 (en) | Methods, systems and computer program products for detecting memory leaks | |
US9959197B2 (en) | Automated bug detection with virtual machine forking | |
US8589884B2 (en) | Method and system for identifying regression test cases for a software | |
US8607198B2 (en) | Cross-concern code coverage assessment | |
CN108153587B (zh) | 一种针对大数据平台的慢任务原因检测方法 | |
US20150095892A1 (en) | Systems and methods for evaluating a change pertaining to a service or machine | |
US20160378583A1 (en) | Management computer and method for evaluating performance threshold value | |
CN107798245B (zh) | 一种基于组件依赖图的软件安全漏洞预测方法 | |
US10866804B2 (en) | Recommendations based on the impact of code changes | |
CN108984416B (zh) | 一种评估Maven环境中依赖冲突危险级别的方法 | |
CN114510722B (zh) | 增量代码的静态检测方法及检测系统 | |
US11169910B2 (en) | Probabilistic software testing via dynamic graphs | |
CN115098292B (zh) | 应用程序崩溃根原因识别方法、装置及电子设备 | |
Amvrosiadis et al. | Getting back up: Understanding how enterprise data backups fail | |
US8214693B2 (en) | Damaged software system detection | |
US9298584B2 (en) | Artifact selection using textual reports | |
CN114006727A (zh) | 告警关联分析方法、装置、设备及存储介质 | |
CN112988503A (zh) | 分析方法、分析装置、电子装置和存储介质 | |
US20190146786A1 (en) | Determining the availability of memory optimizations by analyzing a running binary | |
Sharma et al. | Model-based test case prioritization using ACO: A review | |
WO2011151419A1 (en) | Test operation | |
WO2020127587A1 (en) | Improved application testing |
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 |