具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本申请。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
本发明实施例的一种内存检测方法、内存检测装置及智能设备可应用于机器人、智能手机、平板电脑等智能产品中,为了说明本申请上述的技术方案,下面通过具体实施例来进行说明。
实施例一
下面对本申请实施例提供的一种内存检测方法进行描述,请参阅图1,本申请实施例中的内存检测方法包括:
在步骤101中,在待检测进程启动时,记录上述待检测进程的初始内存总量;
在本申请实施例中,上述待检测进程具体指的是Java进程。在需要检测某个Java进程是否存在内存泄露现象时,首先需要运行该进程,以使得该进程复现其可能存在的内存泄露现象,并在合适的时机通过堆转储操作捕捉该内存泄露现象。基于此,可以由测试人员确定了待检测进程后,触发该待检测进程开始启动运行。在该待检测进程启动时,还可以获取并记录下当前待检测进程的所占用的内存总量,作为初始内存总量,以为后续初次进行内存总量的比对打下基础。
在步骤102中,在上述待检测进程启动后,实时扫描待检测进程当前的内存总量;
在本申请实施例中,一旦上述待检测进程启动后,即刻开始持续性实时扫描待检测进程当前的内存总量,以捕捉上述待检测进程的内存总量在各个时刻的变化。可选地,当上述智能设备搭载的是安卓系统时,可以在上述安卓系统的后台独立运行一个内存检测脚本,并且在上述待检测进行启动之前,就先启动该内存检测脚本的运行,以后续通过该内存检测脚本实时扫描待检测进程当前的内存总量。也即是说,使得上述内存检测脚本的运行时间能够覆盖上述待检测进程的运行时间,以保证待检测进程在整个运行期间都可以被检测到数据。具体地,上述扫描待检测进程当前的内存总量的操作,可以通过指令dumpsysmeminfo实现。
在步骤103中,在待检测进程启动时,以及,在上述待检测进程当前的内存总量与前次进行堆转储操作时的上述待检测进程的内存总量的差值超过预设的差值阈值时,触发上述待检测进程的堆转储操作,以得到堆转储文件;
在本申请实施例中,堆转储的触发时机有两个:其中一个是在待检测进程启动时,触发上述待检测进程的堆转储操作,以得到堆转储文件。这样的目的是记录下待检测进程在初始时刻的运存状况,为后续基于内存泄露的比对提供基础;另一个是在上述待检测进程当前的内存总量与前次进行堆转储操作时的上述待检测进程的内存总量的差值超过预设的差值阈值时,触发上述待检测进程的堆转储操作,以得到堆转储文件。上述预设的差值阈值可以被设定为10兆或其它数值,此处不作限定。考虑到待检测进程的内存泄漏的时机以及泄漏内存量是不确定,因而,通过设定上述两个堆转储的触发时间,在被检测进程的内存总量出现一定程度的内存变化时,自动触发内存堆转储操作,可以避免智能设备无策略的进行内存堆转储操作,避免得到大量的无效数据。
其中,上述触发上述待检测进程的堆转储操作的步骤,具体为:生成预设的堆转储指令;基于上述堆转储指令,将上述待检测进程的内存分布信息导出至预设的文件中。其中,上述预设的堆转储指令为am dumpheap,该堆转储指令可以将待检测进程的内存分布信息导出到hprof文件中。
在步骤104中,对所得到的堆转储文件进行分析;
在本申请实施例中,对通过步骤103所得到的堆转储文件进行分析。可选地,由于理想的内存检测策略是在待检测进程出现内存泄露前后至少导出两份堆转储文件,因而,可以在进行堆转储操作时,以时间顺序对堆转储操作所得到的堆转储文件进行标号;也即,基于各个堆转储文件的创建时间的先后顺序进行标号,例如,初次堆转储操作所得到的堆转储文件标号为1;第二次堆转储操作所得到的堆转储文件标号为2;第三次堆转储操作所得到的堆转储文件标号为3;……以此类推,实现对各个堆转储文件的标号。最后对任意两个相邻标号的堆转储文件进行分析及比对,例如,将标号为1的堆转储文件与标号为2的堆转储文件进行分析及比对。
在步骤105中,根据分析结果确定上述待检测进程的内存状况。
在本申请实施例中,对任意两个相邻标号的堆转储文件进行分析及比对,以确认在此过程中是否出现内存泄露操作,例如,将标号为1的堆转储文件与标号为2的堆转储文件进行分析及比对,基于其分析比对的结果可以确认待检测内存在对应时间段内(也即初次进行堆转储操作的时刻至第二次进行堆转储操作的时刻的时间段内)是否出现内存泄露状况。
可选地,在上述步骤104之前,上述内存检测方法还包括:
基于各个时刻上述待检测进程的内存总量,构建上述待检测进程的内存曲线图;
对上述内存曲线图进行分析,以筛选得到目标曲线段;
相应地,上述对所得到的堆转储文件进行分析,包括:
获取与上述目标曲线段相关联的堆转储文件,作为目标堆转储文件;
对上述目标堆转储文件进行分析。
在本申请实施例中,为了更好的说明上述步骤,请参阅图2,图2给出了一个待检测进程基于各个时刻的内存使用量(也即内存总量)所构建的内存曲线图的示例。考虑到内存泄露的情况往往表现为内存的增长,因而,上述对上述内存曲线图进行分析,以筛选得到目标曲线段的步骤具体包括:
在上述内存曲线图中,基于内存总量的增减趋势,确定一段以上内存上升曲线段;
对于任一内存上升曲线段,获取上述内存上升曲线段在上述内存曲线图中所处的时期;
若上述内存上升曲线段处于上述内存曲线图的预设时期内,则检测在上述内存上升曲线段后,是否存在与上述内存上升曲线段相对应的内存下降曲线段;
若上述内存上升曲线段不存在相对应的内存下降曲线段,则将上述内存上升曲线段确定为目标曲线段。
下面基于图2对上述各个步骤作出说明。通过对图2的分析可知,图2的内存曲线图共有五段内存上升曲线段,分别为曲线C1-C2、曲线C3-C4、曲线C5-C6、曲线C7-C8及曲线C9-C10;随后,需要对上述这些内存上升曲线进行筛选,以保留可能出现内存泄露情况的内存上升曲线段,筛选手段如下:
首先,判断该内存上升曲线段是否为上述内存曲线图的预设时期内,该预设时期指的是内存曲线图的初期阶段:考虑到一般的进程刚刚启动,都需要内存实现具体的工作,所以大部分进程在初始阶段都会出现占用大量内存的情况;也即,相比之后的内存增长,头一次增长曲线是可以理解的。因而可以将处于内存曲线图的初期阶段的内存上升曲线剔除。具体地,可以设定一预设的初期时间段,若内存上升曲线段的开始时间落入该初期时间段内,则认为该内存上升曲线段处于内存曲线图的初期阶段。通过上述方式,可以确定图2中的曲线C1-C2并非目标曲线段。
随后,判断该内存上升曲线段后是否存在与该内存上升曲线段相对应的内存下降曲线段:考虑到进程在正常运行的过程中,占用内存与释放内存往往是相对应出现的,所以此处将后续已经有内存释放操作的内存占用操作判定为待检测进程的正常操作;也即,若存在有相对应的内存释放阶段(内存下降曲线段)段,则前面出现的内存占用阶段(内存上升曲线段)是可以理解的。因而可以将不存在相对应的内存下降曲线段的内存上升曲线段剔除。通过上述方式,可以看到图2中的曲线C3-C4和曲线C7-C8均存在相对应的内存下降曲线,因而,可以确定图2中的曲线C3-C4和曲线C7-C8均非目标曲线段。
在通过上述筛选后,将保留下的内存上升曲线段作为目标曲线段。则针对图2,所得到的目标曲线段为曲线C5-C6以及曲线C9-C10。基于所获得目标曲线段,可以获取与该目标曲线段相关联的堆转储文件,作为目标堆转储文件,并对这些目标堆转储文件进行分析。具体地,可以是获取该目标曲线段的起止时间,然后将创建时间在该目标曲线段的起止时间之内的堆转储文件确定为与该目标曲线段相关联的目标堆转储文件。例如,图2中所构建的内存曲线图中的各个黑点即示出了堆转储文件的创建时间(也即,黑点表示在该时刻对待检测进程进行了一次堆转储操作);因而,可以将曲线C5-C6以及曲线C9-C10上的各个黑点所对应的堆转储文件作为目标堆转储文件进行分析。
可选地,若上述待检测进程存在内存泄露状况,则通过预设的分析工具,例如Memory Analyzer Tool等,对与上述待检测进程相关联的代码段进行分析及定位,以确认引起该内存泄漏状况的Java实例对象和代码位置。
由上可见,通过本申请方案,测试人员可在智能设备的正常测试或使用过程中,在用户无感知的情况下完成内存泄漏的检测工作;通过在后台运行内存检测脚本,排除了测试人员为复现内存泄漏所做的大量测试工作;且在检测的过程中,不再需要实时连接检测设备爱,极大降低了调试难度,减少了测试耗时。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
实施例二
本申请实施例二提供了一种内存检测装置,上述内存检测装置可集成于智能设备中,如图3所示,本申请实施例中的内存检测装置300包括:
记录单元301,用于在待检测进程启动时,记录上述待检测进程的初始内存总量;
堆转储单元302,用于在待检测进程启动时,触发上述待检测进程的堆转储操作,以得到堆转储文件;
扫描单元303,用于在上述待检测进程启动后,实时扫描待检测进程当前的内存总量;
上述堆转储单元302,还用于当上述待检测进程当前的内存总量与前次进行堆转储操作时的上述待检测进程的内存总量的差值超过预设的差值阈值时,触发上述待检测进程的堆转储操作,以得到堆转储文件;
分析单元304,用于对所得到的堆转储文件进行分析;
确定单元305,用于根据分析结果确定上述待检测进程的内存状况。
可选地,上述内存检测装置300应用于安卓系统;上述内存检测装置300还包括:
运行单元,用于在上述安卓系统的后台运行内存检测脚本;
相应地,上述扫描单元303,具体用于通过上述内存检测脚本实时扫描待检测进程当前的内存总量。
可选地,上述堆转储单元302包括:
堆转储指令生成子单元,用于生成预设的堆转储指令;
内存分布信息导出子单元,用于基于上述堆转储指令,将上述待检测进程的内存分布信息导出至预设的文件中。
可选地,上述内存检测装置300还包括:
内存曲线图构建单元,用于基于各个时刻上述待检测进程的内存总量,构建上述待检测进程的内存曲线图;
目标曲线段筛选单元,用于对上述内存曲线图进行分析,以筛选得到目标曲线段;
相应地,上述分析单元304包括:
目标堆转储文件确定子单元,用于获取与上述目标曲线段相关联的堆转储文件,作为目标堆转储文件;
目标堆转储文件分析子单元,用于对上述目标堆转储文件进行分析。
可选地,目标曲线段筛选单元包括:
内存上升曲线段确定子单元,用于在上述内存曲线图中,基于内存总量的增减趋势,确定一段以上内存上升曲线段;
时期获取子单元,用于对于任一内存上升曲线段,获取上述内存上升曲线段在上述内存曲线图中所处的时期;
内存下降曲线段检测子单元,用于若上述内存上升曲线段处于上述内存曲线图的预设时期内,则检测在上述内存上升曲线段后,是否存在与上述内存上升曲线段相对应的内存下降曲线段;
目标曲线段确定子单元,用于若上述内存上升曲线段不存在相对应的内存下降曲线段,则将上述内存上升曲线段确定为目标曲线段。
可选地,上述内存检测装置300还包括:
定位单元,用于若上述待检测进程存在内存泄露状况,则通过预设的分析工具对与上述待检测进程相关联的代码段进行分析及定位,以确认存在内存泄漏状况的Java实例对象和代码位置。
由上可见,通过本申请方案,测试人员可在智能设备的正常测试或使用过程中,在用户无感知的情况下完成内存泄漏的检测工作;通过在后台运行内存检测脚本,排除了测试人员为复现内存泄漏所做的大量测试工作;且在检测的过程中,不再需要实时连接检测设备爱,极大降低了调试难度,减少了测试耗时。
实施例三
本申请实施例三提供了一种智能设备,请参阅图4,本申请实施例中的智能设备4包括:存储器401,一个或多个处理器402(图4中仅示出一个)及存储在存储器401上并可在处理器上运行的计算机程序。其中:存储器401用于存储软件程序以及模块,处理器402通过运行存储在存储器401的软件程序以及单元,从而执行各种功能应用以及数据处理,以获取上述预设事件对应的资源。具体地,处理器402通过运行存储在存储器401的上述计算机程序时实现以下步骤:
在待检测进程启动时,记录上述待检测进程的初始内存总量,并触发上述待检测进程的堆转储操作,以得到堆转储文件;
在上述待检测进程启动后,实时扫描待检测进程当前的内存总量;
当上述待检测进程当前的内存总量与前次进行堆转储操作时的上述待检测进程的内存总量的差值超过预设的差值阈值时,触发上述待检测进程的堆转储操作,以得到堆转储文件;
对所得到的堆转储文件进行分析;
根据分析结果确定上述待检测进程的内存状况。
假设上述为第一种可能的实施方式,则在第一种可能的实施方式作为基础而提供的第二种可能的实施方式中,上述内存检测方法应用于安卓系统;在上述待检测进程启动前,处理器402通过运行存储在存储器401的上述计算机程序时还实现以下步骤:
在上述安卓系统的后台运行内存检测脚本;
相应地,上述实时扫描待检测进程当前的内存总量,包括:
通过上述内存检测脚本实时扫描待检测进程当前的内存总量。
在上述第一种可能的实施方式作为基础而提供的第三种可能的实施方式中,上述触发上述待检测进程的堆转储操作,包括:
生成预设的堆转储指令;
基于上述堆转储指令,将上述待检测进程的内存分布信息导出至预设的文件中。
在上述第一种可能的实施方式作为基础而提供的第四种可能的实施方式中,在上述对所得到的堆转储文件进行分析之前,处理器402通过运行存储在存储器401的上述计算机程序时还实现以下步骤:
基于各个时刻上述待检测进程的内存总量,构建上述待检测进程的内存曲线图;
对上述内存曲线图进行分析,以筛选得到目标曲线段;
相应地,上述对所得到的堆转储文件进行分析,包括:
获取与上述目标曲线段相关联的堆转储文件,作为目标堆转储文件;
对上述目标堆转储文件进行分析。
在上述第四种可能的实施方式作为基础而提供的第五种可能的实施方式中,上述对上述内存曲线图进行分析,以筛选得到目标曲线段,包括:
在上述内存曲线图中,基于内存总量的增减趋势,确定一段以上内存上升曲线段;
对于任一内存上升曲线段,获取上述内存上升曲线段在上述内存曲线图中所处的时期;
若上述内存上升曲线段处于上述内存曲线图的预设时期内,则检测在上述内存上升曲线段后,是否存在与上述内存上升曲线段相对应的内存下降曲线段;
若上述内存上升曲线段不存在相对应的内存下降曲线段,则将上述内存上升曲线段确定为目标曲线段。
在上述第一种可能的实施方式作为基础,或者上述第二种可能的实施方式作为基础,或者上述第三种可能的实施方式作为基础,或者上述第四种可能的实施方式作为基础,或者上述第五种可能的实施方式作为基础而提供的第六种可能的实施方式中,在上述根据分析结果确定上述待检测进程的内存状况之后,处理器402通过运行存储在存储器401的上述计算机程序时还实现以下步骤:
若上述待检测进程存在内存泄露状况,则通过预设的分析工具对与上述待检测进程相关联的代码段进行分析及定位,以确认存在内存泄漏状况的Java实例对象和代码位置。
应当理解,在本申请实施例中,所称处理器402可以是中央处理单元(CentralProcessing Unit,CPU),该处理器还可以是其他通用处理器、数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器401可以包括只读存储器和随机存取存储器,并向处理器402提供指令和数据。存储器401的一部分或全部还可以包括非易失性随机存取存储器。例如,存储器401还可以存储设备类型的信息。
由上可见,通过本申请方案,测试人员可在智能设备的正常测试或使用过程中,在用户无感知的情况下完成内存泄漏的检测工作;通过在后台运行内存检测脚本,排除了测试人员为复现内存泄漏所做的大量测试工作;且在检测的过程中,不再需要实时连接检测设备爱,极大降低了调试难度,减少了测试耗时。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将上述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者外部设备软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如,上述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
上述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
上述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本申请实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,上述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,上述计算机程序包括计算机程序代码,上述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。上述计算机可读存储介质可以包括:能够携带上述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机可读存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,上述计算机可读存储介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读存储介质不包括是电载波信号和电信信号。
以上上述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。