本发明涉及计算机技术领域,尤其涉及一种应用内存泄露的检测方法和装置。
背景技术
内存泄露是指某些生命周期结束的时候没有被收回,仍然占用内存。内存泄露是应用开发过程中常见的问题,严重的泄露会大量消耗内存,对应用本身的体验也会造成极大影响,甚至触发内存溢出等异常行为。
传统的应用内存检测方法,通常在检测到内存泄露的时候立即导出内存堆栈信息进行分析,计算量大、持续时间长。因此效率低下,同时对移动端性能造成非常大的影响,无法大规模高效的检测内存泄露。
技术实现要素:
本发明提供了一种应用内存泄露的检测方法和装置,以解决检测到内存泄露时,直接导出内存堆栈信息进行分析对移动端性能造成影响的问题。
本发明实施例提供了一种应用内存泄露的检测方法,该方法包括:
获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;
根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;
根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。
优选地,所述获取第一终端记录的现场信息,包括:
从服务器中获取所述第一终端记录的现场信息;其中,所述现场信息为在网络空闲时,所述第一终端上传至所述服务器中的现场信息。
优选地,所述现场信息包括:发生内存泄露进程的名称和轨迹信息;则所述根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息,包括:
根据所述轨迹信息,在检测终端中操作所述第二应用,以复现所述内存泄露;
当复现所述内存泄露时,根据所述进程的名称,获取内存堆栈信息。
优选地,所述现场信息还包括:内存泄露对象的名称;所述根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析,包括:
所述检测终端根据所述内存泄露对象的名称,在所述内存堆栈信息中,获取对应的内存泄露的对象;
根据所述内存泄露的对象,获取指向所述对象的强引用,所述强引用即为导致所述第一应用内存泄露的原因。
依据本发明的另一个方面,提供了一种应用内存泄露的检测装置,包括:
检测模块,用于第一终端对第一终端的第一应用进行实时内存泄露检测;
记录模块,用于当检测到所述第一应用内存泄露时,第一终端记录现场信息;
现场信息获取模块,获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;
内存堆栈信息获取模块,用于根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;
分析模块,用于根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。
优选地,所述现场信息获取模块,还包括:
现场信息获取单元,用于从服务器中获取所述第一终端记录的现场信息;其中,所述现场信息为在网络空闲时,所述第一终端上传至所述服务器中的现场信息。
优选地,所述现场信息包括:发生内存泄露进程的名称和轨迹信息;则所述内存堆栈信息获取模块,包括:
操作单元,用于根据所述轨迹信息,在检测终端中操作所述第二应用,以复现所述内存泄露;
内存堆栈信息获取单元,用于当复现所述内存泄露时,根据所述进程的名称,获取内存堆栈信息。
优选地,所述现场信息还包括:内存泄露对象的名称;所述分析模块,包括:
对象获取单元,用于所述检测终端根据所述内存泄露对象的名称,在所述内存堆栈信息中,获取对应的内存泄露的对象;
原因分析单元,用于根据所述内存泄露的对象,获取指向所述对象的强引用,所述强引用即为导致所述第一应用内存泄露的原因。
依据本发明的另一个方面,提供了一种计算机程序,包括计算机可读代码,当所述计算机可读代码在终端设备上运行时,导致所述终端设备执行任一种所述的应用内存泄露的检测方法。
依据本发明的另一个方面,提供了一种计算机可读介质,其中,存储了如上述所述的计算机程序。
本发明实施例包括以下优点:
在本发明实施例中,通过获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。在本发明中,通过将检测内存泄露与分析内存泄露分配给不同终端进行操作,将内存泄露的原因分析过程延迟到另一终端上执行,能够避免用户终端发生卡顿,提高了用户的体验的同时,也能够分析出应用发生内存泄露的原因。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1示出了本发明实施例一中的一种应用内存泄露的检测方法的流程图;
图2示出了本发明实施例二中的一种应用内存泄露的检测方法的流程图;
图3示出了本发明实施例三中的一种应用内存泄露的检测装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。
实施例一
参照图1,示出了本发明实施例一的一种应用内存泄露的检测方法流程图,具体可以包括如下步骤:
步骤101,获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息。
在本发明实施例中,检测终端是独立于第一终端的另一终端,主要用于对第一终端发生内存泄露的原因进行分析,在本发明实施例中,第一终端可以是用户终端。
在本发明实施例中,用户在使用第一终端中的应用时发生内存泄露,第一终端将现场信息进行记录,在网络空闲时,第一终端可以直接将现场信息发送给检测终端,也可以通过其他方式发送给检测终端,本发明对此不加以限制,当检测终端收到现场信息时,即可根据现场信息对内存泄露的原因进行分析。
在具体实现中,本发明实施例可以应用在终端中,该终端可以是手机、平板电脑、个人数字助理、穿戴设备、台式电脑等等。
在本发明实施例中,第一终端的操作系统可以包括android(安卓)等操作系统。这些操作系统可以支持各种系统应用和第三方应用运行,例如,购物客户端、支付客户端、通讯工具等等。
在本发明实施例中,第一终端中安装有第一应用,第一应用在使用中会发生内存泄露。
在本发明实施例中,可以在第一终端中安装用于内存检测的应用,检测第一应用是否发生内存泄露,或者在第一应用中设置相应的检测组件,检测第一应用是否发生内存泄露。本发明实施例对检测应用发生内存泄露的方式不加以限制。
在具体实现中,本发明实施例当检测到第一应用内存泄露时,第一终端及时的记录现场信息。
在本发明实施例中,应用程序通常是由java语言或者能在java虚拟机上运行的语言编写,本发明实施例的对象是指java等面对对象语言编写的类的实例。
在本发明实施例中,当第一应用的程序在运行时,会开启一个或多个进程运行相关任务。为了要区分是哪个进程发生了内存泄露,因此需要记录发生内存泄露进程的名称。例如当微信在开启时,会存在com.tencent.mm和com.tencent.mm:push等进程,所以需要记录具体是哪一个进程发生内存泄露。
在本发明实施例中,例如,用户在打开应用a之后,分别进行了哪些操作,本发明实施例将这些轨迹信息进行记录。
在本发明实施例中,现场信息直接通过文本方式记录到日志中,比如,内存泄露对象的名称和进程的名称可以记录成:2018-03-07_13:23:07android.arch.lifecycle.reportfragmentcom.qiyi.video。轨迹信息记录成:2018-03-07_13:21:24onpauseorg.qiyi.android.video.mainactivity。2018-03-07_13:21:24onresumecom.iqiyi.pay.vip.activity.phonepayactivity。2018-03-07_13:21:30onpausecom.iqiyi.pay.vip.activity.phonepayactivity。2018-03-07_13:22:56onresumeorg.qiyi.android.video.mainactivity。本发明实施例将这些现场信息记录在日志中,以便后续调用。
步骤102,根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同。
在本发明实施例中,检测终端中需安装有与第一应用相同的第二应用,比如,第一终端中安装有微信客户端,则检测终端中需安装有同版本的微信客户端。
在本发明实施例中,检测终端根据现场信息,即第一终端在生内存泄露时的现场状态,重新操作与第一应用相同的第二应用。例如,在第一应用中用户的操作是,打开应用a,点击扫一扫功能,扫码后,点击支付,录入指纹,支付成功;则在检测终端中对应用a进行同样的操作。
在本发明实施例中,当对第二应用进行同样的操作后,当检测到第二应用发生同样的内存泄露时,即可在检测终端中获取内存堆栈信息。
步骤103,根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。
在本发明实施例中,当获取到内存堆栈信息后,即可在内存堆栈信息中查找内存泄露的对象,即这个对象已经不再使用,但是堆栈信息中依旧存在gc(垃圾回收器)根节点到这个对象的引用链,导致对象无法收回,发送内存泄露,即为内存泄露的原因。
在本发明实施例中,通过获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。在本发明中,通过将检测内存泄露与分析内存泄露分配给不同终端进行操作,将内存泄露的原因分析过程延迟到另一终端上执行,能够避免用户终端发生卡顿,提高了用户的体验的同时,也能够分析出应用发生内存泄露的原因。
实施例二
参照图2,示出了本发明实施例二的一种应用内存泄露的检测方法流程图,具体可以包括如下步骤:
步骤201,从服务器中获取所述第一终端记录的现场信息;其中,所述现场信息为在网络空闲时,所述第一终端上传至所述服务器中的现场信息。
在本发明实施例中,第一终端在使用第一应用时发生内存泄露,但是如果此时第一终端直接对内存泄露的原因进行分析,由于分析时计算量大,持续时间长,务必会给用户对第一终端的使用造成影响,影响用户体验,所以本发明实施例中,在网络空闲时,将现场信息自动上传至服务器中,能够避免对用户使用及第一终端性能的影响。
在本发明实施例中,可以具有多个第一终端,例如,第一终端a在使用第一应用时发生内存泄露,则第一终端a将自身的现场信息发送给服务器,第一终端b在使用第一应用时发生内存泄露,则第一终端b将自身的现场信息发送给服务器。服务器可以将所有第一终端在使用第一应用时发生内存泄露的现场信息进行汇总存储。
在本发明实施例中,所有用户都可以成为第一应用内存泄露的发现者,有助于对发生内存泄露的原因进行分析,实现大规模检测,提高检测的效率。
在本发明实施例中,检测终端从服务器中获取第一终端关于第一应用的现象信息,第一终端的第一应用发生现场泄露的原因进行分析,也可以获取,多个第一终端的第一应用的现场信息,对第一应用发生现场泄露的整体原因进行分析,本发明实施例对此不加以限制。
步骤202,根据所述轨迹信息,在检测终端中操作所述第二应用。
在本发明实施例中,现场信息包括发生内存泄露进程的名称和轨迹信息;
在本发明实施例中,轨迹信息是根据用户操作第一应用时发生内存泄露时出现的,根据轨迹信息操作第二应用,例如:轨迹信息为:用户使用第一终端,打开打开应用a,点击扫一扫功能,扫码后,点击支付,录入指纹,支付成功;则在检测终端中对应用a进行同样的操作,由于第二应用和第一应用相同,则对第二应用进行同样的操作时,会复现操作第一应用时发生的内存泄露。
步骤203,当复现所述内存泄露时,根据所述进程的名称,获取内存堆栈信息。
在本发明实施例中,现场信息中包括,进程的名称,则在检测终端复现内存泄露是,根据进程的名称,在检测终端中查找此进程,由于每个进程都有自己的内存堆栈信息,则根据查找到的进程,导出此进程对应的内存堆栈信息。
在本发明实施例中,能够将内存泄露转移至检测终端进行分析,降低了多用户使用第一终端的影响,提高了检测的效率。
步骤204,所述检测终端根据所述内存泄露对象的名称,在所述内存堆栈信息中,获取对应的内存泄露的对象。
在本发明实施例中,所述现场信息还包括:内存泄露对象的名称;当导出内存堆栈信息,则根据内存泄露对象的名称在内存堆栈信息中,查找到对应的对象。
步骤205,根据所述内存泄露的对象,获取指向所述对象的强引用,所述强引用即为导致所述第一应用内存泄露的原因。
在本发明实施例中,当查找到发生内存泄露的对象后,分析出哪些是指向该对象的强引用。正是由于这些强引用,使对象不在使用时,仍然存在从gc根节点到这个对象的引用链,导致java虚拟机的垃圾收回机制无法回收这个对象,发生内存泄露。本发明实施例在找到这些强引用后,后续可通过修改代码,及时消除这些强引用,修复内存泄露。
在本发明实施例中,通过从服务器中获取第一终端记录的现场信息,现场信息为在网络空闲时,第一终端上传至服务器中的现场信息。根据所述轨迹信息,在检测终端中操作所述第二应用。当复现所述内存泄露时,根据所述进程的名称,获取内存堆栈信息,所述检测终端根据所述内存泄露对象的名称,在所述内存堆栈信息中,获取对应的内存泄露的对象。根据所述内存泄露的对象,获取指向所述对象的强引用,所述强引用即为导致所述第一应用内存泄露的原因。在本发明实施例中,多个终端在使用第一应用时,不同的操作会发生不同的内存泄露。每个终端都记录自身的现场信息,将其上传至服务器中,服务器将现场信息进行整理发送给检测终端,则检测终端会分析第一应用会发生哪些内存泄露。进而可以改善第一应用,提高第一应用的使用性能,同时,在内存泄露的检测及分析过程并不会影响用户使用第一终端和第一应用,提高用户体验。
实施例三
参照图3,示出了本发明实施例三的一种应用内存泄露的检测装置的流程框图,具体可以包括如下模块:
现场信息获取模块301,获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;
内存堆栈信息获取模块302,用于根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;
分析模块303,用于根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。
可选的,所述现场信息获取模块,还包括:
现场信息获取单元,用于从服务器中获取所述第一终端记录的现场信息;其中,所述现场信息为在网络空闲时,所述第一终端上传至所述服务器中的现场信息。
可选的,所述现场信息包括:发生内存泄露进程的名称和轨迹信息;则所述内存堆栈信息获取模块,包括:
操作单元,用于根据所述轨迹信息,在检测终端中操作所述第二应用,以复现所述内存泄露;
内存堆栈信息获取单元,用于当复现所述内存泄露时,根据所述进程的名称,获取内存堆栈信息。
可选的,所述现场信息还包括:内存泄露对象的名称;则所述分析模块,包括:
对象获取单元,用于所述检测终端根据所述内存泄露对象的名称,在所述内存堆栈信息中,获取对应的内存泄露的对象;
原因分析单元,用于根据所述内存泄露的对象,获取指向所述对象的强引用,所述强引用即为导致所述第一应用内存泄露的原因。
在本发明实施例中,通过获取第一终端记录的现场信息;其中,所述现场信息为所述第一终端检测到第一应用内存泄露时记录的现场信息;根据所述现场信息,在检测终端中操作第二应用,获取内存堆栈信息;其中,所述第一应用与所述第二应用相同;根据所述内存堆栈信息,对导致所述第一应用内存泄露的原因进行分析。在本发明中,通过将检测内存泄露与分析内存泄露分配给不同终端进行操作,将内存泄露的原因分析过程延迟到另一终端上执行,能够避免用户终端发生卡顿,提高了用户的体验的同时,也能够分析出应用发生内存泄露的原因。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种应用内存泄露的检测方法和装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。