内存泄漏监测方法、装置、电子设备及计算机存储介质与流程

专利2022-06-30  61


本发明实施例涉及计算机技术领域,尤其涉及一种内存泄漏监测方法、装置、电子设备及计算机存储介质。



背景技术:

随着安卓(android)应用开发越来越成熟,安卓应用的性能越来越被关注。其中,内存泄漏是影响应用性能的一个关键点。

在安卓应用运行过程中,如果无用的对象没有被及时释放引用,导致gc(garbagecollection)无法回收,就有可能出现内存泄漏的情况。如果发生内存泄漏,除会增加内存占用,严重时导致oom(outofmemory)甚至应用崩溃的现象外,还会带来信息泄漏等不安全问题。现有的对内存泄漏进行监测的方案中,是通过监控安卓应用中的activity组件的生命周期,防止activity组件被消耗后依然占用内存而导致内存泄漏。但是这种监测主要针对activity组件,而对其它对象则无法监测,最终导致某些对象仍然存在内存泄漏的问题。



技术实现要素:

有鉴于此,本发明实施例提供一种内存泄漏监测方案,以解决上述问题。

根据本发明实施例的第一方面,提供了一种内存泄漏监测方法,包括:当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;对所述目标碎片对象占用的内存空间执行回收操作;在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;若不包含,则确定所述目标碎片对象存在内存泄漏。

根据本发明实施例的第二方面,提供了一种内存泄漏监测装置,包括:生成模块,用于当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;回收模块,用于对所述目标碎片对象占用的内存空间执行回收操作;检测模块,用于在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;第一确定模块,用于若不包含,则确定所述目标碎片对象存在内存泄漏。

根据本发明实施例的第三方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如第一方面所述的内存泄漏监测方法对应的操作。

根据本发明实施例的第四方面,提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所述的内存泄漏监测方法。

根据本发明实施例提供的内存泄漏监测方案,当监测到对目标碎片对象的销毁事件时,生成与目标碎片对象对应的引用对象,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,可以准确地监测目标碎片对象是否导致内存泄漏,进而可以及时发现由于activity组件之外的对象,如目标碎片对象引起的内存泄漏,解决现有技术中无法对activity组件之外的对象进行内存泄漏监测,导致无法有效降低内存泄漏的问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1为根据本发明实施例一的一种内存泄漏监测方法的步骤流程图;

图2为根据本发明实施例二的一种内存泄漏监测方法的步骤流程图;

图3为根据本发明实施例三的一种内存泄漏监测装置的结构框图;

图4为根据本发明实施例四的一种内存泄漏监测装置的结构框图;

图5为根据本发明实施例五的一种电子设备的结构示意图。

具体实施方式

为了使本领域的人员更好地理解本发明实施例中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明实施例一部分实施例,而不是全部的实施例。基于本发明实施例中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本发明实施例保护的范围。

下面结合本发明实施例附图进一步说明本发明实施例具体实现。

实施例一

参照图1,示出了根据本发明实施例一的一种内存泄漏监测方法的步骤流程图。

本实施例中的内存泄漏监测方法用于监测安卓(android)应用中的fragment类对象是否导致内存泄漏,以解决现有技术中的无法有效监测应用中fragment类对象,导致无法避免内存泄漏和信息泄漏,造成应用性能提升受限的问题。当然,在其他实施例中,该内存泄漏监测方法还可以应用到其他适合的场景中,进行内存泄漏监测。其中,内存泄漏是指无用的对象没有被及时释放引用,导致垃圾回收(garbagecollection)操作无法回收内存,导致内存泄漏。

本实施例的内存泄漏监测方法包括以下步骤:

步骤s102:当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象。

在安卓(android)应用中,目标碎片对象可以是fragment类的对象。fragment类对象可以用于表示activity组件中的行为或用户界面的一部分。在一个activity组件中使用多个fragment类对象组合来构建多窗格的ui(userinterface,用户界面),或者在多个activity组件中重复使用某个fragment类对象。fragment类对象有自己的生命周期(如创建事件、挂起事件、重启事件、销毁事件等),能接收输入,并且可以在activity组件运行时创建或者销毁fragment类对象,fragment类对象具有独立处理输入事件的能力,且具有自己的生命周期,但又依赖于activity组件,能与activity组件互相通信和托管。

本实施例中,监测到针对目标碎片对象的销毁事件(ondestroy)可以是,例如,当目标碎片对象的生命周期指示其处于被销毁状态时,即表示监测到针对目标碎片对象的销毁事件。

若监测到针对目标碎片对象的销毁事件,则生成与目标碎片对象对应的引用对象,例如,可以是通过弱引用方式引用该目标碎片对象的引用对象。如:leakweakreferencea=newleakweakreference(fragmenta,……)中的fragmenta为目标碎片对象,leakweakreferencea为与目标碎片对象对应的引用对象。

需要说明的是,在本实施例中,所述引用对象为与引用队列关联的引用对象,包括但不限于采用弱引用方式的引用对象(如weakreference)、采用虚引用方式的引用对象(如phantomreference)和采用软引用方式的引用对象(如softreference)等。关联有引用队列(referencequeue)的引用对象,在其对应的目标碎片对象被执行回收操作后,该目标碎片对象的信息会被添加到关联的引用队列中,利用此种原理,就可以确定目标碎片对象占用的内存空间是否被成功回收。

步骤s104:对所述目标碎片对象占用的内存空间执行回收操作。

当目标碎片对象被销毁后,需要对目标碎片对象占用的内存空间执行回收操作,以回收内存空间,以备后续使用。本领域技术人员可以根据需要选择任何适当的回收操作进行内存回收。例如,回收操作可以是垃圾回收(garbagecollection)操作。

步骤s106:在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息。

当引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息。利用这一原理,在回收操作完成后,获取引用对象关联的所述引用队列,若引用队列中包含目标碎片对象的信息,则确定目标碎片对象占用的内存空间被成功回收;反之,若不包含目标碎片对象的信息,则执行步骤s108。

步骤s108:若引用队列中不包含所述目标碎片对象的信息,则确定所述目标碎片对象存在内存泄漏。

当引用队列中不包含目标碎片对象的信息时,表示目标碎片对象所占用的内存空间未被成功回收,可能存在内存泄漏。通过这种方式就可以实现对目标碎片对象的监测,确保在应用运行中当发生由于碎片对象引发的内存泄漏时可以及时监测到,进而可以根据需要对监测到的内存泄漏进行及时处理,以提升应用的性能。

通过本实施例,当监测到对目标碎片对象的销毁事件时,生成与目标碎片对象对应的引用对象,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,可以准确地监测目标碎片对象是否导致内存泄漏,进而可以及时发现由于activity组件之外的对象,如目标碎片对象引起的内存泄漏,解决现有技术中无法对activity组件之外的对象进行内存泄漏监测,导致无法有效降低内存泄漏的问题。

本实施例的内存泄漏监测方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如平板电脑、手机等)和pc机等。

实施例二

参照图2,示出了根据本发明实施例二的一种内存泄漏监测方法的步骤流程图。

本实施例仍以对安卓(android)应用进行内存泄漏监测为例,本实施例的内存泄漏监测包括以下步骤:

步骤s202:获取所述目标碎片对象的生命周期信息,根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

如实施例一所述,本实施例中的内存泄漏监测方法用于监测安卓(android)应用中的目标碎片对象即fragment类对象是否导致内存泄漏,从而避免内存泄漏情况,提升应用的性能。

生命周期信息用于保存对应的对象的生命周期状态,并允许其他对象了解此状态。生命周期信息包括但不限于:基于创建事件的创建状态、基于重新启动事件的重启状态、基于销毁事件的销毁状态等。

现有的安卓应用中可以通过在application组件中注册activitylifecyclecallbacks方法来监测activity组件的生命周期信息。由于fragment对象依赖于activity组件,只有activity组件被创建,且未被注销的情况下才能通过fragmentlifecyclecallbacks方法监测fragment组件的生命周期信息,当activity组件被销毁时,需要通过unregisteractivitylifecyclecallbacks方法反注册释放,导致在activity组件被销毁后,无法通过fragmentlifecyclecallbacks方法监测到fragment对象的销毁,进而无法在fragment对象销毁时及时检测其占用的内存空间是否被成功回收,有无内存泄漏。

为此,本发明实施例中针对目标碎片对象建立了生命周期监测对象,以获取目标碎片对象的生命周期信息,进而确定是否监测到针对目标碎片对象的销毁事件。

在本实施例中,一种可行方式中,所述获取所述目标碎片对象的生命周期信息包括以下子步骤:

子步骤s202a:为已创建的所述目标碎片对象建立生命周期监测对象。

其中,生命周期监测对象可以是通过add方法(即添加方法)添加的genericlifecycleobserver对象。

具体地,在安卓应用中,由于目标碎片对象依赖于activity组件,因此,在一种可行方式中,为已创建的目标碎片对象建立生命周期监测对象之前,需要监控是否创建有相应的activity组件,具体过程可以是:

首先,确定是否创建有目标碎片对象,即监测目标碎片对象的创建事件(oncreat)。由于目标碎片对象依赖于activity组件,所以在监测目标碎片对象时,需要先监测activity组件是否被创建。

例如,通过application组件(应用组件,安卓应用启动时都会创建一个application组件)的registeractivitylifecyclecallbacks方法注册activitylifecyclecallbacks,监控activity组件的生命周期信息,从而确定activity组件是否被创建。

当监测到activity组件的创建事件后,通过registerfragmentlifecyclecallbacks方法,监控fragment(即目标碎片对象),以监测fragment是否被创建。

之后,当监测到fragment被创建时,通过fragment的getlifecycle方法获得fragment的生命周期信息,以确定其是否被销毁,以便在fragment被销毁后及时确定其占用的内存空间是否被回收,确定是否存在内存泄漏。

例如,在fragment中调用getlifecycle方法,得到lifecycleregistry对象,然后调用addobserver()方法将genericlifecycleobserver接口的对象作为参数传进去,完成注册监听的过程。通过genericlifecycleobserver对象监测fragment的生命周期,确定是否发生针对fragment的销毁事件。

通过这种为已创建的所述目标碎片对象建立生命周期监测对象(genericlifecycleobserver)的方式监测fragment的销毁事件,可以确保无论activity组件是否销毁均能够监测到fragment的销毁事件,解决现有技术中activity组件销毁时,需要通过unregisteractivitylifecyclecallbacks方法,反注册才能释放掉,导致fragment的lifecycle也会被释放掉,无法监测fragment的销毁事件的问题。

子步骤s202b:使用所述生命周期监测对象对所述目标碎片对象进行监测,获取所述目标碎片对象的生命周期信息。

通过生命周期监测对象即genericlifecycleobserver对象获取目标碎片对象的生命周期信息。以根据生命周期信息确定是否监测到针对目标碎片对象的销毁事件。当监测到销毁事件时,执行步骤s204。

步骤s204:当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象。

一种可行方式中,步骤s204包括:当通过所述生命周期监测对象监测到针对所述目标碎片对象的销毁事件时,移除所述生命周期监测对象并生成所述目标碎片对象对应的引用对象。

其中,移除生命周期监测对象可以通过removeobserver方法实现。

所述引用对象为与引用队列关联的引用对象。在安卓中,引用方式包括但不限于强引用、弱引用、虚引用和软引用等。其中,强引用可以直接访问目标对象,强引用所关联的目标对象,在任何时候都不会被gc(garbagecollection)回收内存,由于强引用的目标对象不会gc主动回收,所以强引用并没有关联的引用队列。而针对强引用之外的非强引用,即弱引用、虚引用和软引用,由于它们的目标对象可能会被gc主动回收内存,因此非强引用具有关联的引用队列,且当非强引用的目标对象被gc执行内存空间回收操作后,目标对象的信息会添加到引用队列中。

基于前述的原理,可以为目标碎片对象生成引用对象,通过确定引用对象关联的引用队列中是否包含目标碎片对象的信息,就可以确定目标碎片对象占用的内存空间是否被成功回收。

本实施例中,所述引用对象包括下列至少之一:通过弱引用方式引用所述目标碎片对象的引用对象如android中的通过weakreference()引用该目标碎片对象生成的引用对象、通过虚引用方式引用所述目标碎片对象的引用对象如android中的phantomreference()引用该目标碎片对象生成的引用对象、通过软引用方式引用所述目标碎片对象的引用对象如android中的通过softreference()引用该目标碎片对象生成的引用对象。

步骤s206:对所述目标碎片对象占用的内存空间执行回收操作。

当目标碎片对象被销毁后,需要对目标碎片对象占用的内存空间执行回收操作,以回收内存空间,以备后续使用。本领域技术人员可以根据需要选择任何适当的回收操作进行内存回收。例如,回收操作可以是垃圾回收(garbagecollection)操作。

具体例如:执行标记(mark)操作、计划(plan)操作、清理(sweep)操作、引用更新(relcate)操作和压缩(compact)操作。

例如,通过标记操作找出所有引用不为0(live)的实例;计划操作以判断是否需要压缩;清理操作以回收free空间;引用更新操作以将所有引用的地址进行更新;压缩操作以减少内存碎片,实现内存空间回收。

步骤s208:在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息。

需要说明的是,为了确保判断结果的准确性,在本实施例中,回收操作完成可以是当执行回收操作后,延时设定时间(如5s),确定回收操作完成。设定时间的具体时间值可以根据需要确定,本实施例对此不作限定。

本步骤中,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,在回收操作完成后,获取引用对象关联的所述引用队列,若引用队列中包含目标碎片对象的信息,则表示目标碎片对象占用的内存空间被成功回收;反之,若不包含目标碎片对象的信息,则执行步骤s210。

步骤s210:若所述引用队列中包含所述目标碎片对象的信息,则确定所述目标碎片对象存在内存泄漏。

当引用队列中不包含目标碎片对象的信息时,表示目标碎片对象所占用的内存空间未被成功回收,可能存在内存泄漏。通过这种方式就可以实现对目标碎片对象的监测,确保在应用运行中当发生由于碎片对象引发的内存泄漏时可以及时监测到,进而可以根据需要对监测到的内存泄漏进行及时处理,以提升应用的性能。

通过本实施例,当监测到对目标碎片对象的销毁事件时,生成与目标碎片对象对应的引用对象,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,可以准确地监测目标碎片对象是否导致内存泄漏,进而可以及时发现由于activity组件之外的对象,如目标碎片对象引起的内存泄漏,解决现有技术中无法对activity组件之外的对象进行内存泄漏监测,导致无法有效降低内存泄漏的问题。

此外,通过目标碎片对象的genericlifecycleobserver方法获取目标碎片对象的生命周期信息,可以非侵入式地监控目标碎片对象的销毁事件,减少应用负担,且可以减少开发成本。

通过监测目标碎片对象的销毁事件触发是否发生内存泄漏的检测,可以准确及时地监测到是否发生内存泄漏,提升应用的性能,有效避免内存泄漏。

本实施例的内存泄漏监测方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如平板电脑、手机等)和pc机等。

实施例三

参照图3,示出了根据本发明实施例三的一种内存泄漏监测装置的结构框图。

本实施例的内存泄漏监测装置包括:生成模块302,用于当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;回收模块304,用于对所述目标碎片对象占用的内存空间执行回收操作;检测模块306,用于在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;第一确定模块308,用于若不包含,则确定所述目标碎片对象存在内存泄漏。

通过本实施例,当监测到对目标碎片对象的销毁事件时,生成与目标碎片对象对应的引用对象,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,可以准确地监测目标碎片对象是否导致内存泄漏,进而可以及时发现由于activity组件之外的对象,如目标碎片对象引起的内存泄漏,解决现有技术中无法对activity组件之外的对象进行内存泄漏监测,导致无法有效降低内存泄漏的问题。

实施例四

参照图4,示出了根据本发明实施例四的一种内存泄漏监测装置的结构框图。

本实施例的内存泄漏监测装置包括:生成模块402,用于当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;回收模块404,用于对所述目标碎片对象占用的内存空间执行回收操作;检测模块406,用于在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;第一确定模块408,用于若不包含,则确定所述目标碎片对象存在内存泄漏。

可选地,所述引用对象包括下列至少之一:通过弱引用方式引用所述目标碎片对象的引用对象、通过虚引用方式引用所述目标碎片对象的引用对象、通过软引用方式引用所述目标碎片对象的引用对象。

可选地,所述装置还包括:获取模块410,用于在所述生成模块402监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象之前,获取所述目标碎片对象的生命周期信息,根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

可选地,所述获取模块410包括:创建模块4101,用于为已创建的所述目标碎片对象建立生命周期监测对象;监测模块4102,用于使用所述生命周期监测对象对所述目标碎片对象进行监测,获取所述目标碎片对象的生命周期信息;第二确定模块4103,用于根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

可选地,所述生成模块402用于当通过所述生命周期监测对象监测到针对所述目标碎片对象的销毁事件时,移除所述生命周期监测对象并生成所述目标碎片对象对应的引用对象。

本实施例的内存泄漏监测装置用于实现前述多个方法实施例中相应的内存泄漏监测方法,并具有相应方法实施例的有益效果,在此不再赘述。

实施例五

参照图5,示出了根据本发明实施例五的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。

如图5所示,该电子设备可以包括:处理器(processor)502、通信接口(communicationsinterface)504、存储器(memory)506、以及通信总线508。

其中:

处理器502、通信接口504、以及存储器506通过通信总线508完成相互间的通信。

通信接口504,用于与其它电子设备如终端设备或服务器进行通信。

处理器502,用于执行程序510,具体可以执行上述内存泄漏监测方法实施例中的相关步骤。

具体地,程序510可以包括程序代码,该程序代码包括计算机操作指令。

处理器502可能是中央处理器cpu,或者是特定集成电路asic(applicationspecificintegratedcircuit),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个cpu;也可以是不同类型的处理器,如一个或多个cpu以及一个或多个asic。

存储器506,用于存放程序510。存储器506可能包含高速ram存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。

程序510具体可以用于使得处理器502执行以下操作:当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;对所述目标碎片对象占用的内存空间执行回收操作;在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;若不包含,则确定所述目标碎片对象存在内存泄漏。

在一种可选的实施方式中,所述引用对象包括下列至少之一:通过弱引用方式引用所述目标碎片对象的引用对象、通过虚引用方式引用所述目标碎片对象的引用对象、通过软引用方式引用所述目标碎片对象的引用对象。

在一种可选的实施方式中,程序510还用于使得处理器502在当监测到针对目标碎片对象的销毁事件,生成所述目标碎片对象对应的引用对象之前,获取所述目标碎片对象的生命周期信息,根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

在一种可选的实施方式中,程序510还用于使得处理器502在所述获取所述目标碎片对象的生命周期信息时,为已创建的所述目标碎片对象建立生命周期监测对象;使用所述生命周期监测对象对所述目标碎片对象进行监测,获取所述目标碎片对象的生命周期信息。

在一种可选的实施方式中,程序510还用于使得处理器502在监测到针对目标碎片对象的销毁事件,生成所述目标碎片对象对应的引用对象时,当通过所述生命周期监测对象监测到针对所述目标碎片对象的销毁事件时,移除所述生命周期监测对象并生成所述目标碎片对象对应的引用对象。

程序510中各步骤的具体实现可以参见上述内存泄漏监测方法实施例中的相应步骤和单元中对应的描述,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。

通过本实施例的电子设备,当监测到对目标碎片对象的销毁事件时,生成与目标碎片对象对应的引用对象,利用引用对象引用的目标碎片对象占用的内存空间被成功回收后,引用对象关联的引用队列中会加入该目标碎片对象的信息的原理,可以准确地监测目标碎片对象是否导致内存泄漏,进而可以及时发现由于activity组件之外的对象,如目标碎片对象引起的内存泄漏,解决现有技术中无法对activity组件之外的对象进行内存泄漏监测,导致无法有效降低内存泄漏的问题。

需要指出,根据实施的需要,可将本发明实施例中描述的各个部件/步骤拆分为更多部件/步骤,也可将两个或多个部件/步骤或者部件/步骤的部分操作组合成新的部件/步骤,以实现本发明实施例的目的。

上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可存储在记录介质(诸如cdrom、ram、软盘、硬盘或磁光盘)中的软件或计算机代码,或者被实现通过网络下载的原始存储在远程记录介质或非暂时机器可读介质中并将被存储在本地记录介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件(诸如asic或fpga)的记录介质上的这样的软件处理。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件(例如,ram、rom、闪存等),当所述软件或计算机代码被计算机、处理器或硬件访问且执行时,实现在此描述的内存泄漏监测方法。此外,当通用计算机访问用于实现在此示出的内存泄漏监测方法的代码时,代码的执行将通用计算机转换为用于执行在此示出的内存泄漏监测方法的专用计算机。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明实施例的范围。

以上实施方式仅用于说明本发明实施例,而并非对本发明实施例的限制,有关技术领域的普通技术人员,在不脱离本发明实施例的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明实施例的范畴,本发明实施例的专利保护范围应由权利要求限定。


技术特征:

1.一种内存泄漏监测方法,其特征在于,包括:

当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;

对所述目标碎片对象占用的内存空间执行回收操作;

在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;

若不包含,则确定所述目标碎片对象存在内存泄漏。

2.根据权利要求1所述的方法,其特征在于,所述引用对象包括下列至少之一:通过弱引用方式引用所述目标碎片对象的引用对象、通过虚引用方式引用所述目标碎片对象的引用对象、通过软引用方式引用所述目标碎片对象的引用对象。

3.根据权利要求1或2所述的方法,其特征在于,在当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象之前,所述方法还包括:

获取所述目标碎片对象的生命周期信息,根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

4.根据权利要求3所述的方法,其特征在于,所述获取所述目标碎片对象的生命周期信息,包括:

为已创建的所述目标碎片对象建立生命周期监测对象;

使用所述生命周期监测对象对所述目标碎片对象进行监测,获取所述目标碎片对象的生命周期信息。

5.根据权利要求4所述的方法,其特征在于,所述当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,包括:

当通过所述生命周期监测对象监测到针对所述目标碎片对象的销毁事件时,移除所述生命周期监测对象并生成所述目标碎片对象对应的引用对象。

6.一种内存泄漏监测装置,其特征在于,包括:

生成模块,用于当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;

回收模块,用于对所述目标碎片对象占用的内存空间执行回收操作;

检测模块,用于在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;

第一确定模块,用于若不包含,则确定所述目标碎片对象存在内存泄漏。

7.根据权利要求6所述的装置,其特征在于,所述引用对象包括下列至少之一:通过弱引用方式引用所述目标碎片对象的引用对象、通过虚引用方式引用所述目标碎片对象的引用对象、通过软引用方式引用所述目标碎片对象的引用对象。

8.根据权利要求6或7所述的装置,其特征在于,所述装置还包括:

获取模块,用于在所述生成模块监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象之前,获取所述目标碎片对象的生命周期信息,根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

9.根据权利要求8所述的装置,其特征在于,所述获取模块包括:

创建模块,用于为已创建的所述目标碎片对象建立生命周期监测对象;

监测模块,用于使用所述生命周期监测对象对所述目标碎片对象进行监测,获取所述目标碎片对象的生命周期信息;

第二确定模块,用于根据所述生命周期信息确定是否监测到针对所述目标碎片对象的销毁事件。

10.根据权利要求9所述的装置,其特征在于,所述生成模块用于当通过所述生命周期监测对象监测到针对所述目标碎片对象的销毁事件时,移除所述生命周期监测对象并生成所述目标碎片对象对应的引用对象。

11.一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;

所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如权利要求1-5中任一项所述的内存泄漏监测方法对应的操作。

12.一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如权利要求1-5中任一所述的内存泄漏监测方法。

技术总结
本发明实施例提供了一种内存泄漏监测方法、装置、电子设备及计算机存储介质。其中,内存泄漏监测方法包括:当监测到针对目标碎片对象的销毁事件时,生成所述目标碎片对象对应的引用对象,其中,所述引用对象为与引用队列关联的引用对象;对所述目标碎片对象占用的内存空间执行回收操作;在回收操作完成后,获取所述引用对象关联的所述引用队列,并检测所述引用队列中是否包含所述目标碎片对象的信息;若不包含,则确定所述目标碎片对象存在内存泄漏。通过本发明实施例,可以有效避免内存泄漏。

技术研发人员:谭泰
受保护的技术使用者:阿里巴巴集团控股有限公司
技术研发日:2018.11.28
技术公布日:2020.06.05

转载请注明原文地址: https://bbs.8miu.com/read-58992.html

最新回复(0)