一种对象回收方法、装置、电子设备及存储介质与流程

文档序号:17288030发布日期:2019-04-03 03:43阅读:120来源:国知局
一种对象回收方法、装置、电子设备及存储介质与流程

本发明涉及安卓应用开发技术领域,特别是涉及一种对象回收方法、一种对象回收装置、一种电子设备、一种计算机可读存储介质。



背景技术:

art(androidruntime)虚拟机是google公司设计的、用于android系统的虚拟机,在启用art模式后,系统在安装应用的时候会进行一次预编译,将代码转换为机器语言存储在本地,这样,在运行程序时就不用每次都进行编译了。

art虚拟机执行的是java语言,而java语言中一个显著的特点是:引入了垃圾回收机制,因此,art虚拟机能够自行决定内存的分配和回收,但是,现有技术中,android系统仍然存在内存回收率较低的技术问题。

具体的,art虚拟机不定期地检查内存中是否存在没有被其他对象引用的finalize对象,如果检查到内存中存在没有被其他对象引用的finalize对象,将该finalize对象加入到referencequeue链表中,然后对该finalize对象执行finalize函数及remove函数,以将该finalize对象回收,由于该回收过程所需要的时间较长,因此,造成android系统的内存回收率较低。



技术实现要素:

本发明实施例的目的在于提供一种对象回收方法、装置、电子设备及存储介质,以加快referencequeue链表中finalize对象的回收速率,提高android系统的内存回收率。具体技术方案如下:

第一方面,本发明实施例提供了一种对象回收方法,所述方法包括:

获取安卓系统的referencequeue链表中的finalize对象;

判断获取的所述finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;

如果是,调用所述referencequeue链表的remove函数回收所述finalize对象。

可选的,如果获取的所述finalize对象不为预设的不需要调用finalize函数就能够被回收的目标finalize对象,所述方法还包括:

通过先后调用所述referencequeue链表的finalize函数和所述remove函数,回收所述finalize对象。

可选的,在所述判断获取的所述finalize对象是否为预设的不需要调用finalize函数能够被回收的目标finalize对象之前,所述方法还包括:

获取所述finalize对象所属类的类标识;

所述判断获取的所述finalize对象是否为预设的不需要调用finalize函数能够被回收的目标finalize对象,包括:

判断获取的所述finalize对象所属类的类标识,是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识。

可选的,预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识存储于预设的目标对象清单中;

所述判断获取的所述finalize对象所属类的类标识,是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识,包括:

判断获取的所述finalize对象所属类的类标识,是否位于所述目标对象清单中。

可选的,在所述获取安卓系统的referencequeue链表中的finalize对象之前,所述方法还包括:

判断所述安卓系统中是否存在当前未被其他finalize对象引用的finalize对象;

若存在,将所述当前未被其他finalize对象引用的finalize对象加入到所述referencequeue链表中。

第二方面,本发明实施例还提供了一种对象回收装置,所述装置包括:

第一获取模块,用于获取安卓系统的referencequeue链表中的finalize对象;

第一判断模块,用于判断获取的所述finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;

第一调用模块,用于如果所述判断模块判断出获取的所述finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,调用所述referencequeue链表的remove函数回收所述finalize对象。

可选的,所述装置还包括:

第二调用模块,用于如果获取的所述finalize对象不为预设的不需要调用finalize函数就能够被回收的目标finalize对象,通过先后调用所述referencequeue链表的finalize函数和所述remove函数,回收所述finalize对象。

可选的,所述装置还包括:

第二获取模块,用于在所述判断获取的所述finalize对象是否为预设的不需要调用finalize函数能够被回收的目标finalize对象之前,获取所述finalize对象所属类的类标识;

所述判断模块,具体用于:

判断获取的所述finalize对象所属类的类标识,是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识。

可选的,预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识存储于预设的目标对象清单中;

所述判断模块,具体用于:

判断获取的所述finalize对象所属类的类标识,是否位于所述目标对象清单中。

可选的,所述装置还包括:

第二判断模块,用于在所述获取安卓系统的referencequeue链表中的finalize对象之前,判断所述安卓系统中是否存在当前未被其他finalize对象引用的finalize对象;

添加模块,用于若所述第二判断模块判断出所述安卓系统中存在当前未被其他finalize对象引用的finalize对象,将所述当前未被其他finalize对象引用的finalize对象加入到所述referencequeue链表中。

第三方面,本发明实施例还提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;

存储器,用于存放计算机程序;

处理器,用于执行存储器上所存放的程序时,实现第一方面的任一对象回收方法的方法步骤。

第四方面,本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现第一方面的任一对象回收方法的方法步骤。

与现有技术相比,本发明实施例提供的技术方案,首先,获取安卓系统的referencequeue链表中的finalize对象;然后,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;如果获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,那么,直接调用referencequeue链表的remove函数回收该finalize对象。而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。

图1为本发明实施例所提供的一种对象回收方法的流程示意图;

图2为本发明实施例所提供的另一种对象回收方法的流程示意图;

图3为本发明实施例所提供的一种对象回收装置的结构示意图;

图4为本发明实施例所提供的一种电子设备的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了解决现有技术问题,本发明实施例提供了一种对象回收方法、装置、电子设备及可读存储介质,以加快referencequeue链表中finalize对象的回收速率,提高android系统的内存回收率。

第一方面,下面将对本发明实施例所提供的一种对象回收方法进行介绍。

如图1所示,本发明实施例所提供的一种对象回收方法,包括如下步骤:

s101,获取安卓系统的referencequeue链表中的finalize对象。

s102,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象。

s103,如果是,调用referencequeue链表的remove函数回收该finalize对象。

采用上述图1所示的对象回收方法,在获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象时,可以直接调用referencequeue链表的remove函数回收该finalize对象;而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

进一步的,上述图1所示的对象回收方法中,在判断获取的finalize对象是否为目标finalize对象时,可以基于finalize对象所属类的类标识进行判断,以及,在判断结果为不为目标finalize对象时,可以调用referencequeue链表的finalize函数进行回收。

下面结合附图2,用具体实施例对本发明实施例提供的对象回收方法及装置等进行详细描述。

图2为本发明实施例提供的一种对象回收方法的详细流程图,具体可以包括如下步骤:

s201,获取安卓系统的referencequeue链表中的finalize对象。

在一种实现方式中,获取referencequeue链表中的finalize对象的过程可以为:判断安卓系统中是否存在没有被其他finalize对象引用的finalize对象,如果安卓系统中存在没有被其他finalize对象引用的finalize对象,则该finalize对象为待回收finalize对象,因此,可以将该finalize对象加入到referencequeue链表中,即获取到referencequeue链表中的finalize对象。

在上述描述中,安卓系统中的finalize对象既可以被该finalize对象所属类中的其他finalize对象引用,也可以被属于其他类的finalize对象引用,也就是说,某个finalize对象只要被其他任一finalize对象引用,即可以判断出该finalize对象被引用;否则,该finalize对象没有被引用,将该finalize对象加入到referencequeue链表中。

s202,获取该finalize对象所属类的类标识。

每一个finalize对象属于一个类,而每个类均具有一个类标识,因此,每个finalize对象对应一个类标识。

在本步骤中,获取该finalize对象所属类的类标识的过程可以为:首先根据finalize对象与类的对应关系,查找到该finalize对象所属的类;再根据类与类标识的对应关系,确定该finalize对象所属的类的类标识。

上述该类标识可以是类名称,还可以是其他能够对类起标识作用的信息,例如,可以对类进行编号,此时类编号也可以作为类标识,本发明实施例对类标识不作具体限定。

s203,判断获取的该finalize对象所属类的类标识,是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识;如果是,则进入s204,如果否,则进入s205;

为了方案描述清楚,首先对“如何确定一个finalize对象是否为目标finalize对象”进行说明。

发明人经过大量的实验发现:referencequeue链表中的一些finalize对象必须要经过referencequeue链表的finalize函数将其由不可回收状态转化为可回收状态,然后才能通过referencequeue链表的remove函数将其回收;而另一些finalize对象则不需要经过referencequeue链表的finalize函数的转化,直接通过referencequeue链表的remove函数就可以将其进行回收,这些finalize对象即为目标finalize对象。

在确定了目标finalize对象之后,将目标finalize对象的类标识预先存储在art虚拟机中,从而在获取到referencequeue链表的finalize对象的类标识后,将获取到的该类标识与art虚拟机中预先存储的目标finalize对象的类标识进行比较,如果该类标识与其中一个目标finalize对象的类标识相同,则判断该finalize对象所属类的类标识,为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识,此时,进入步骤s204;否则,进入步骤s205。

在一种实现方式中,可以将上述目标对象所属类的类标识存储于预设的目标对象清单中,举例而言,finalize对象1、finalize对象2、finalize对象5是只通过referencequeue链表的remove函数就可以回收的finalize对象,可以将finalize对象1、finalize对象2、finalize对象5所属类的类标识存储在该预设的目标对象清单中。

在获取到referencequeue链表中的finalize对象所属类的类标识后,判断该类标识是否在该预设的目标对象清单中,如果在目标对象清单中,则判断出获取到的该finalize对象是目标finalize对象;如果不在目标对象清单中,则判断出获取到的该finalize对象不是目标finalize对象。

当然,上述目标对象所述类的类标识可以存储于预设的目标对象清单中,还可以存储在其他任何可以存储信息的文件中,例如,存储在数组中。本发明实施例对上述目标对象所述类的类标识的存储位置不做具体限定。

s204,调用referencequeue链表的remove函数回收该finalize对象;

在判断出获取的该finalize对象所属类的类标识在目标对象清单之后,则直接调用referencequeue链表的remove函数回收该finalize对象,而不用像现有技术那样,对于referencequeue链表中的任意一个finalize对象,都需要先调用referencequeue链表中的finalize函数,将该finalize对象由不可回收状态转化为可回收状态,再调用referencequeue链表中的remove函数,从而回收该finalize对象,可见,本发明实施例能够加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

举例而言,finalize对象1为不需要调用finalize函数就可以回收的目标finalize对象。现有技术中,要将该finalize对象1进行回收,先调用referencequeue链表的finalize函数,将finalize对象1由不可回收状态转化为可回收状态,假设这个过程需要1秒;然后再调用referencequeue链表的remove函数,将该finalize对象1进行回收,这个过程也需要1秒,那么现有技术回收该finalize对象1需要2秒的时间;而本发明实施例提供的技术方案,在将该finalize对象1回收时,只需要调用remove函数,就可以将该finalize对象1进行回收。因此,本发明实施例回收该finalize对象1需要1秒的时间,可见,本发明实施例提供的技术方案,缩短了finalize对象1的回收时间,加快了finalize对象1的回收速率。

s205,通过先后调用referencequeue链表的finalize函数和remove函数,回收该finalize对象。

在判断出获取的该finalize对象所属类的类标识不在目标对象清单时,则说明该finalize对象不是目标finalize对象,此时需要先调用referencequeue链表中的finalize函数,将该finalize对象由不可回收状态转化为可回收状态,再调用referencequeue链表中的remove函数,从而回收该finalize对象。

与现有技术相比,本发明实施例提供的技术方案,首先,获取安卓系统的referencequeue链表中的finalize对象;然后,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;如果获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,那么,直接调用referencequeue链表的remove函数回收该finalize对象。而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,从而使得android系统的内存回收率有所提高。

第二方面,本发明实施例还提供了一种对象回收装置,如图3所示,所述装置包括:

第一获取模块310,用于获取安卓系统的referencequeue链表中的finalize对象;

第一判断模块320,用于判断获取的所述finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;

第一调用模块330,用于如果所述判断模块判断出获取的所述finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,调用所述referencequeue链表的remove函数回收所述finalize对象。

与现有技术相比,本发明实施例提供的技术方案,首先,获取安卓系统的referencequeue链表中的finalize对象;然后,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;如果获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,那么,直接调用referencequeue链表的remove函数回收该finalize对象。而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

可选的,所述装置还包括:

第二调用模块,用于如果获取的所述finalize对象不为预设的不需要调用finalize函数就能够被回收的目标finalize对象,通过先后调用所述referencequeue链表的finalize函数和所述remove函数,回收所述finalize对象。

可选的,所述装置还包括:

第二获取模块,用于在所述判断获取的所述finalize对象是否为预设的不需要调用finalize函数能够被回收的目标finalize对象之前,获取所述finalize对象所属类的类标识;

所述判断模块,具体用于:

判断获取的所述finalize对象所属类的类标识,是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识。

可选的,预设的不需要调用finalize函数就能够被回收的目标finalize对象所属类的类标识存储于预设的目标对象清单中;

所述判断模块,具体用于:

判断获取的所述finalize对象所属类的类标识,是否位于所述目标对象清单中。

可选的,所述装置还包括:

第二判断模块,用于在所述获取安卓系统的referencequeue链表中的finalize对象之前,判断所述安卓系统中是否存在当前未被其他finalize对象引用的finalize对象;

添加模块,用于若所述第二判断模块判断出所述安卓系统中存在当前未被其他finalize对象引用的finalize对象,将所述当前未被其他finalize对象引用的finalize对象加入到所述referencequeue链表中。

第三方面,本发明实施例还提供了一种电子设备,如图4所示,包括处理器401、通信接口402、存储器403和通信总线404,其中,处理器401,通信接口402,存储器403通过通信总线404完成相互间的通信,

存储器403,用于存放计算机程序;

处理器401,用于执行存储器403上所存放的程序时,实现上述方法实施例所述的任一对象回收方法。

上述电子设备提到的通信总线可以是外设部件互连标准(peripheralcomponentinterconnect,pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,eisa)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

通信接口用于上述电子设备与其他设备之间的通信。

存储器可以包括随机存取存储器(randomaccessmemory,ram),也可以包括非易失性存储器(non-volatilememory,nvm),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。

上述的处理器可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器(digitalsignalprocessing,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

与现有技术相比,本发明实施例提供的技术方案,首先,获取安卓系统的referencequeue链表中的finalize对象;然后,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;如果获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,那么,直接调用referencequeue链表的remove函数回收该finalize对象。而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

第四方面,在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述方法实施例中所述的任一对象回收方法。

与现有技术相比,本发明实施例提供的技术方案,首先,获取安卓系统的referencequeue链表中的finalize对象;然后,判断获取的该finalize对象是否为预设的不需要调用finalize函数就能够被回收的目标finalize对象;如果获取的该finalize对象为预设的不需要调用finalize函数就能够被回收的目标finalize对象,那么,直接调用referencequeue链表的remove函数回收该finalize对象。而不用像现有技术那样,必须先调用referencequeue链表的finalize函数,再调用referencequeue链表的remove函数,才能回收referencequeue链表中的finalize对象。因此,本发明实施例提供的技术方案,可以加快referencequeue链表中finalize对象的回收速率,使得android系统的内存回收率有所提高。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、电子设备、可读存储介质的实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1