内存垃圾回收的方法、装置及计算机存储介质与流程

文档序号:15931695发布日期:2018-11-14 01:44阅读:192来源:国知局

本申请涉及计算机技术领域,并且更具体地,涉及一种内存垃圾回收的方法、装置及计算机存储介质。

背景技术

近年来,随着物联网(internetofthings,iot)技术的快速发展,出现了很多种类的iot设备。由于iot设备的内存资源有限(flash小于128kb,ram小于64kb),为了能够将应用或者服务方便地部署到iot设备中,一个有效的方式是在iot设备中支持javascript(以下简称js)语言,但是js运行过程中会产生大量的垃圾对象,需要采用自动回收机制进行垃圾回收(garbagecollection,gc)。

现有技术中通过引用计数法来回收iot设备中不再被应用程序使用的对象,从而实现对内存资源的自动回收。引用计数法通过为每个节点(该节点也可以称为内存储对象,简称“对象”)维护一个引用计数,当有新的引用指向该节点时,其引用计数就加1,当指向该节点的某个应用被销毁时,其引用计数就减1,当计数归零时,该节点占用的内存资源就被回收。

但是,引用计数法无法回收发生循环引用(referencecycle,rc)的节点,如图1所示,r1、r2和r3构成了rc环(图中的ref表示相应节点的引用计数值),r1存在外部引用,r1的引用计数值为2,r2和r3的引用计数值为1。如图2所示,当外部引用消失时,但是由于环内节点之间存在互相引用,r1、r2和r3的引用计数却无法清零,从而导致部分内存无法得到回收,造成内存资源的浪费。



技术实现要素:

本申请提供一种内存垃圾回收的方法、装置及计算机存储介质,能够实现对垃圾rc环的回收。

第一方面,提供了一种内存垃圾回收的方法,该方法包括:根据应用程序的标记节点以及所述标记节点的引用计数值,确定所述标记节点是否位于垃圾循环引用rc环中,其中,所述垃圾rc环中的节点均不存在外部引用;在所述标记节点位于所述垃圾rc环中时,对所述垃圾rc环中的节点进行回收。

本申请中,通过标记节点以及标记节点的引用计数值能够确定标记节点是否位于垃圾rc环内,并且在标记节点位于垃圾rc环内的情况下,能够实现对垃圾rc环的回收。

结合第一方面,在第一方面的某些实现方式中,所述根据应用程序的标记节点以及所述标记节点的引用计数值,确定所述标记节点是否位于垃圾循环引用rc环中,包括:将当前节点的子节点的引用计数值减1,如果所述当前节点的子节点中出现引用计数值为0的第一目标子节点,则将所述第一目标子节点作为所述当前节点,重新执行本步骤,直到满足目标条件,如果所述当前节点的子节点中未出现所述第一目标子节点,则退出本步骤,其中,所述标记节点为所述当前节点的初始值,所述目标条件是所述当前节点的第一目标子节点中出现所述标记节点;在满足所述目标条件的情况下,确定所述标记节点位于所述垃圾rc环中。

上述对当前节点的子节点的引用计数值减1,并且在当前子节点的子节点中出现第一目标子节点的情况下,能够将第一目标子节点作为当前节点,继续对当前节点的引用计数值减1,该过程可以称之为减法操作。通过该减法操作能够较为方便地确定标记节点是否位于垃圾rc环中,以便于在确定标记节点位于垃圾rc环之后能够对垃圾rc环中的节点进行回收。

结合第一方面,在第一方面的某些实现方式中,所述方法还包括:在不满足所述目标条件的情况下,确定所述标记节点位于非垃圾rc环中;对所述当前节点以及所述当前节点的子节点的引用计数值进行恢复。

当标记节点不在垃圾rc环时,通过对当前节点以及当前节点的引用计数值进行恢复,能够恢复非垃圾rc换的引用计数值,从而确保执行回收操作后其它非垃圾rc环节点的引用关系的正确性。

结合第一方面,在第一方面的某些实现方式中,所述对所述当前节点以及所述当前节点的子节点的引用计数值进行恢复,包括:将当前节点的子节点的引用计数值加1,如果所述当前节点的子节点中出现引用计数值为1的第二目标子节点,则将所述第二目标子节点作为所述当前节点,重新执行本步骤,如果所述当前节点的子节点中未出现所述第二目标子节点,则退出本步骤。

结合第一方面,在第一方面的某些实现方式中,所述方法还包括:确定标记节点集合,其中,所述标记节点集合包含多个节点,所述标记节点为所述多个节点中的任意一个节点。

第二方面,提供了一种内存垃圾回收的装置,所述装置包括用于执行所述第一方面或其各种实现方式中的方法的模块。

第三方面,提供一种内存垃圾回收的装置,该装置包括:存储介质,以及中央处理器,所述存储介质可以是非易失性存储介质,所述存储介质中存储有计算机可执行程序,所述中央处理器与所述非易失性存储介质连接,并执行所述计算机可执行程序以实现所述第一方面或其各种实现方式中的方法。

第四方面,提供一种计算机可读介质,所述计算机可读介质存储用于计算机执行的程序代码,所述程序代码包括用于执行第一方面或其各种实现方式中的方法的指令。

应理解,本发明第二至第四方面所提供的技术方案与第一方面所提供的技术方案,技术手段一致,技术的有益效果类似,不再赘述。

附图说明

图1是rc环的示意图。

图2是rc环的示意图。

图3是本申请实施例的内存垃圾回收的方法的示意性流程图。

图4是rc环的示意图。

图5是rc环的示意图。

图6是rc环的示意图。

图7是rc环的示意图。

图8是rc环的示意图。

图9是rc环的示意图。

图10是rc环的示意图。

图11是rc环的示意图。

图12是本申请实施例的内存垃圾回收的方法的示意性流程图。

图13是本申请实施例的多个节点的示意图。

图14是本申请实施例的多个节点的示意图。

图15是本申请实施例的多个节点的示意图。

图16是本申请实施例的多个节点的示意图。

图17是本申请实施例的多个节点的示意图。

图18是本申请实施例的多个节点的示意图。

图19是本申请实施例的多个节点的示意图。

图20是本申请实施例的多个节点的示意图。

图21是本申请实施例的内存垃圾回收的装置的示意性框图。

图22是本申请实施例的内存垃圾回收的装置的示意性框图。

具体实施方式

下面将结合附图,对本申请中的技术方案进行描述。

图3是本申请实施例的内存垃圾的回收方法的示意性流程图。图3的方法包括:

110、根据应用程序的标记节点以及标记节点的引用计数值,确定标记节点是否位于垃圾rc环中,其中,垃圾rc环中的节点均不存在外部引用。

例如,如图4所示,节点a和节点b之间互相引用,没有其他的外部引用指向节点a和节点b,那么a和b就构成了垃圾rc环。

另外,如图5所示,节点a、b、c之间互相引用,没有外部引用指向这三个节点,那么,a、b、c这三个节点也构成了一个垃圾rc环。

如图6所示,节点a、b、c之间互相引用,存在外部引用指向a,因此,a、b、c这三个节点构成的是一个非垃圾rc环。

上述垃圾rc环可以认为与应用程序运行无关的内存节点,而非垃圾rc环可以认为是与应用程序运行有关的一些内存节点。

可选地,在对应用程序中的节点进行标记时可以通过调用内建函数的方式来实现,例如,在js虚拟机中通过添加内建函数setcycleheader的方式,实现对某个节点的标记。在应用程序运行的过程中,执行此内建函数,将rc环中的节点的内存头中的is_root标记位设置为true,并将该节点添加到标记节点集合(也可以称为循环链表集)中,以便于接下来确定标记节点集合中的每个节点是否位于rc环中。

120、在标记节点位于垃圾rc环中的情况下,对垃圾rc环中的节点进行回收。

本申请中,通过标记节点以及标记节点的引用计数值能够确定标记节点是否位于垃圾rc环内,并且在标记节点位于垃圾rc环内的情况下,能够实现对垃圾rc环的回收。

上述标记节点可以是通过对可能的rc环中的节点进行标记得到的,与现有技术中通过标记强引用(strong)、弱引用(weak)以及无主引用(unowned)的方式来回收垃圾rc环的方式相比,大大简化了标记规则,易于实现。具体来说,现有技术中需要考虑不同的情况来设置弱引用或者无主引用,规则比较繁琐严格,设置错误可能会导致较为严重的内存问题,而本申请中只要对疑似rc环中的节点进行标记即可,漏标或者错标均不会影响对内存垃圾的回收。

可选地,上述标记节点可以是用户对应用程序中可能形成rc环的节点进行标记后得到的节点。具体地,用户可以在程序开发阶段对可能位于rc环的节点进行标记,并将标记节点加入到标记节点集合(该标记节点集合可以包含多个标记后的节点)中,接下来,运用图3的方法对每个标记节点进行处理,确定每个标记节点是否位于垃圾rc环中。

应理解,将rc环中的任意一个节点标记为标记节点,都可以从该标记节点出发遍历到所有rc环内的其它节点。

程序开发者对可能的rc环中的节点进行标记来得到标记节点,这样能够缩小rc环节点的检测范围,降低算法的内存消耗并提高实时性。

可选地,图3的方法还包括:确定标记节点集合,其中,该标记节点集合包含多个节点,上述标记节点为多个节点中的任意一个节点。应理解,在对可能的rc环中的节点进行标记后可以得到多个标记后的节点,将多个标记后的节点组合在一起就得到了标记节点集合。

可选地,根据应用程序的标记节点以及标记节点的引用计数值,确定标记节点是否位于垃圾rc环中,具体包括:将当前节点的子节点的引用计数值减1,如果当前节点的子节点中出现引用计数值为0的第一目标子节点,则将第一目标子节点作为当前节点,重新执行本步骤,直到满足目标条件,如果当前节点的子节点中未出现第一目标子节点,则退出本步骤,其中,标记节点为当前节点的初始值,目标条件是当前节点的第一目标子节点中出现标记节点;在满足目标条件的情况下,确定标记节点位于垃圾rc环中。

上述对当前节点的子节点的引用计数值减1,并且在当前子节点的子节点中出现第一目标子节点的情况下,能够将第一目标子节点作为当前节点,继续对当前节点的引用计数值减1,该过程可以称之为减法操作(decrease)。通过该减法操作能够较为方便地确定标记节点是否位于垃圾rc环中,以便于在确定标记节点位于垃圾rc环之后能够对垃圾rc环中的节点进行回收。

为了更好地理解减法操作,下面结合伪代码对减法操作的原理进行说明。

减法操作的相关伪代码如下:

具体地,在运用减法操作对上述标记节点进行处理时,首先是先遍历标记节点集合(cycle_roots),然后对每个标记节点(root)及其所引用子节点的引用计数值(ref)进行减量运算(decrease(root))

在遍历标记节点集合时,如果某个标记节点的引用计数值为0,那么将其从标记节点集合中删除,开始处理标记节点集合中的下一个标记节点;如果某个标记节点的引用计数值不为0,那么就开始处理该标记节点的子节点,并将该标记节点设置为已经经过减法操作的节点(root.is_decreased=true)。

在处理标记节点的子节点时,在令标记节点的子节点的ref=ref-1后,如果该子节点的ref≠0,那么就停止对该子节点的分支的遍历;在令标记节点的子节点的ref=ref-1后,如果该子节点的ref=0,并且该子节点也不属于已经进行过减法操作的节点,那么,需要进一步对该子节点的直接子节点执行减1操作;如果令标记节点的子节点的ref=ref-1后,该子节点的ref=0,但是该子节点属于已经经过减法操作处理的节点,那么就停止对该子节点的分支的遍历。

下面结合图7至图9对减法操作的过程进行详细的介绍。

如图7所示,a为标记节点,确定a是否位于垃圾rc环的具体过程如下:

将a的子节点b的引用计数值减1,使得节点b的引用计数值变为0,由于b的引用计数值在减1后变成0,接下来对b的子节点c的引用计数值减1,使得c的引用计数值在减1变成0,接下来对c的子节点a的引用计数值减1,使得a的引用计数值在减1变成0,经过减法操作后,这三个节点的引用计数值如图8所示。由图8可知,在将a、b和c三者之间由于互相引用而产生的引用计数值减去后,这三个节点的引用计数值均为0,因此,a位于rc环中,并且该rc环为垃圾rc环。接下来,就可以对a所在的垃圾rc环进行回收了。

如图9所示,a为标记节点,确定a是否位于垃圾rc环的具体过程如下:

将a的子节点b的引用计数值减1,使得b的引用计数值由2变为1,由于a只存在一个子节点b,并且b的引用计数值在经过减法操作后没有等于0,因此,对b的子节点不再执行减法操作。经过减法操作后这三个节点的引用计数值如图10所示,如图10所示,a、b和c构成了rc环,但是由于b存在外部引用,因此,该rc环不属于垃圾rc环,也就是说节点a没有位于垃圾rc环中,而是位于非垃圾rc环中。因此,接下来,不能对a所在的非垃圾rc环进行回收。

通过减法操作,垃圾rc环中的节点的引用计数值被清零,也就是说,垃圾rc环经过减法操作后,环内的所有节点的引用计数值一定为0,接下来就可以对该垃圾rc环中的节点进行回收了。

应理解,在标记节点时,对于每一个rc环,应当至少标记出其中的一个节点,如果标记出了某个rc环的多个节点也不会影响对内存垃圾的回收,而对于某个rc环来说,如果未标记出该rc环中的任何节点,则无法回收该rc环,进而会造成内存泄露。另外,为了提高回收垃圾内存的效率,可以在确定rc环的情况下,仅标记该rc环中的一个节点作为标记节点,而在不确定某个节点是否为位于rc环的情况下,也对该节点进行标记,将某个节点误标为rc环中的节点也不影响对内存垃圾的回收。

例如,当标记节点为误标的非垃圾rc环节点时,并且在采用上述减法操作对其进行处理之前该标记节点的引用计数值已经变成0,那么就可以将其从标记节点集合中删除,采用现有技术中的正常rc机制(当某个节点的引用计数值变为0时就对该节点进行回收)对该标记节点进行回收。

应理解,在本申请中,在采用减法操作对标记节点所在的rc环中的某个节点的引用计数值进行减法处理后,如果该节点的引用计数值为0,图3的方法并不立即对该节点进行回收,而是在确定标记节点处于垃圾rc环之后对该垃圾rc环中的节点均进行回收,或者,在确定标记节点没有位于垃圾rc环时对该标记节点及其子节点中由于减法操作减去的引用计数值进行恢复。

可选地,在一些实施例中,图3的方法还包括:在不满足上述目标条件的情况下,确定标记节点位于非垃圾rc环中;对当前节点以及当前节点的子节点的引用计数值进行恢复。

当标记节点不在垃圾rc环时,通过对当前节点以及当前节点的引用计数值进行恢复,能够恢复非垃圾rc换的引用计数值,从而确保执行回收操作后其它非垃圾rc环节点的引用关系的正确性。

例如,在对图9中的标记节点及其子节点执行减法操作后各个节点的引用计数值如图10所示,在将a的子节点b的引用计数值减1之后b的引用计数值不为0,因此,最终确定a没有位于rc环中,接下来,需要对b的引用计数值进行恢复,将b的引用计数值恢复到减法操作前的2。

可选地,对当前节点以及当前节点的子节点的引用计数值进行恢复,具体包括:将当前节点的子节点的引用计数值加1,如果当前节点的子节点中出现引用计数值为1的第二目标子节点,则将第二目标子节点作为当前节点,重新执行本步骤,如果当前节点的子节点中未出现第二目标子节点,则退出本步骤。

可选地,在确定了标记节点处于垃圾rc环之后,可以将该垃圾rc环添加到垃圾节点集合中,接下来再对其它的标记节点进行类似处理,将其他节点所处的垃圾rc环也添加到垃圾节点集合中,然后对垃圾节点集合中的节点进行回收。

应理解,在本申请中,可以将所有的标记节点所处的垃圾rc环添加到垃圾节点集合之后再对垃圾节点集合中的节点进行回收,也可以是在确定了某个标记节点所处的垃圾rc环之后就直接对该垃圾rc环中的节点进行回收。

例如,如图10所示,在经过减法操作后,b节点的引用计数值恢复由2变成了1,接下来,需要对b节点的引用计数值进行恢复。如图11所示,对b节点的引用计数值进行恢复的具体过程为:从标记节点a出发,将a的子节点b的引用计数值加1,使得b的引用计数值变成2,由于b的引用计数值为1,对引用计数值进行恢复的过程结束。

应理解,上述对当前节点的子节点的引用计数值加1以实现对节点的引用计数值进行恢复可以称为恢复(restore)操作。应理解,在上述执行恢复操作时,为了避免进行重复的恢复操作,可以设置need_restore标志位,在对某个节点进行恢复操作之后就对将节点的need_restore标志位设置为ture。

为了更好地理解恢复操作,下面结合伪代码对减法操作的原理进行说明。

恢复操作相关的伪代码如下:

具体地,在运用恢复操作对上述标记节点进行处理时,首先是遍历标记节点集合(cycle_roots),然后对每个引用计数值非0的节点及其子节点的引用计数值进行恢复操作。

在执行恢复操作时,令标记节点(该标记节点的引用计数值不为0)的子节点的ref=ref+1后,如果该子节点的ref≠1,那么就停止对该子节点的分支的遍历;在令标记节点的子节点的ref=ref+1后,如果该子节点的ref=1,也就是由0变成1,那么进一步对该子节点的子节点执行加1操作。

应理解,恢复操作相当于减法操作的逆运算,当标记节点位于垃圾rc环时,对该垃圾rc环执行了减法操作之后,接下来不对该垃圾rc环进行恢复操作;而当标记节点位于非垃圾rc环时,在对该非垃圾rc环执行了减法操作之后还需要对该非垃圾rc环执行恢复操作,从而将非垃圾rc环中的节点的引用计数值恢复到减法操作之前的数值,以保证回收操作后非垃圾rc环的引用关系的正确性。

在确定了标记节点处于垃圾rc环之后,就可以对垃圾rc环中的节点进行回收。下面结合伪代码对回收操作的原理进行说明。

回收操作相关的伪代码如下:

遍历标记节点集合,经过减法操作和恢复操作后,仅有垃圾rc环节点(包括用于标记该垃圾rc环的标记节点)的ref被清零。为了防止同一rc环内存在多个节点以及环内本身存在的循环引用导致的重复收集,设置了is_collected标志位,收集某一节点的时候将该标志位置为true,而收集前则判断该标志位为false方可添加到垃圾节点集。收集ref为0的节点及其ref为0的子节点,予以释放,从记节点集合中删除该节点,完成本次垃圾rc环回收,并将标记节点集合中剩余节点除is_root外的标志位清除,等待下一次垃圾rc环回收算法的调用。

可选地,可以在每个节点的内存头(memheader)预留位中设置4个标志位供回收垃圾内存时使用。节点的各个标志位表示的含义具体如下:

下面结合图12至图20对本申请实施例的内存垃圾的回收方法进行详细的介绍。

图12示出了对内存垃圾进行回收的整个过程。该过程具体包括:

210、对应用程序中的节点进行标记,得到标记节点。

220、确定标记节点集合{r1、r2、r3}。

在图13中,r1、r2、r3为加入到标记节点的疑似rc环节点,a-e为递归遍历时如标记节点发生引用关系的其它节点,形成循环引用的关系有[r1,b],[r1,c,b],[r2,r3]。假设执行减法操作的顺序为r1-r2-r3。

230、执行减法操作:

执行减法操作的具体包括对r1、r2和r3依次执行减法操作。

对r1及其子节点执行减法操作具体包括:

(1)将r1的子节点a、b和c的引用计数值减1,得到图14所示的结果;

(2)由于c的引用计数值变为0,因此,将c的子节点b和r2的引用计数值减1,得到图15所示的结果;

(3)由于b的引用计数值变为0,因此,将b的子节点r1的引用计数值减1,得到图16所示的结果。

由于r1已经进行过减法操作,因此,终止对r1节点及其子节点的减法操作。

对r2及其子节点执行减法操作具体包括:

(4)将r2的子节点r3的引用计数值减1,得到图17所示的结果;

(5)由于r3的引用计数值变为0,因此,将r3的子节点r2、d和e的引用计数值减1,得到图18所示的结果。

由于r2已经进行过减法操作,因此,终止对r2节点及其子节点的减法操作。

对r3及其子节点执行减法操作具体包括:

由于在步骤220中已经对r3执行过减法操作,并且r3的引用计数值为0,不再对r3及其子节点进行减法操作,将r3从标记节点集合中删除,完成本次减法操作。

240、遍历标记节点集合,对标记集合中引用计数值不为0的标记节点及其子节点进行恢复操作。

具体地,经过减法操作后,遍历标记节点集合中的标记节点,由于r1和r3的引用计数值变为0,r2的引用计数值变为1,那么仅需要将r2的need_restore的标志位设置为ture即可,这样在恢复操作是只需要对need_restore标志位为ture的节点r2进行恢复操作。

对r2进行恢复操作的过程具体如下:

(6)将r2的子节点r3的引用计数值加1,得到图19所示的结果;

(7)对r3的子节点r2、d和e的引用计数值加1,得到图20所示的结果。

由于r2的引用计数值在加1后引用计数值不为1,因此,对r2及其其子节点进行恢复操作结束。

250、收集垃圾rc环。

260、对垃圾rc环中的节点进行回收。

如图20所示,在经过减法操作和恢复操作之后,标记节点r1的引用计数值变为0,因而收集r1,及其引用计数值为0的子节点b和c,而子节点a由于仍有外部引用,所以a的引用计数值未被置0,那么可收集垃圾环[r1,c,b]中的节点并对其进行释放,而rc环[r2,r3]中由于r2仍存在外部引用,所以引用计数值未被置零,为非垃圾rc环,留待下次再进行检测。

上文结合图3至图20对本申请实施例的内存垃圾回收的方法进行了详细的描述,下面结合图21至图22对本申请实施例的内存垃圾回收的装置进行描述,应理解,图21和图22中的装置能够实现上文中描述的内存垃圾回收的方法的各个步骤,为了简洁,下面适当省略重复的描述。

图21是本申请实施例的内存垃圾回收的装置的示意性框图。图21的装置300可以执行上述图3中的内存垃圾回收的方法。该装置300包括:

确定模块310,用于根据应用程序的标记节点以及所述标记节点的引用计数值,确定所述标记节点是否位于垃圾循环引用rc环中,其中,所述垃圾rc环中的节点均不存在外部引用;

回收模块320,用于在所述标记节点位于所述垃圾rc环中时,对所述垃圾rc环中的节点进行回收。

可选地,作为一个实施例,所述确定模块310具体用于:将当前节点的子节点的引用计数值减1,如果所述当前节点的子节点中出现引用计数值为0的第一目标子节点,则将所述第一目标子节点作为所述当前节点,重新执行本步骤,直到满足目标条件,如果所述当前节点的子节点中未出现所述第一目标子节点,则退出本步骤,其中,所述标记节点为所述当前节点的初始值,所述目标条件是所述当前节点的第一目标子节点中出现所述标记节点;在满足所述目标条件的情况下,确定所述标记节点位于所述垃圾rc环中。

可选地,作为一个实施例,所述确定模块310还用于:在不满足所述目标条件的情况下,确定所述标记节点位于非垃圾rc环中;

所述装置300还包括:

恢复模块320,用于对所述当前节点以及所述当前节点的子节点的引用计数值进行恢复。

可选地,作为一个实施例,所述恢复模块320具体用于:将当前节点的子节点的引用计数值加1,如果所述当前节点的子节点中出现引用计数值为1的第二目标子节点,则将所述第二目标子节点作为所述当前节点,重新执行本步骤,如果所述当前节点的子节点中未出现所述第二目标子节点,则退出本步骤。

可选地,作为一个实施例,所述确定模块310还用于确定标记节点集合,其中,所述标记节点集合包含多个节点,所述标记节点为所述多个节点中的任意一个节点。

图22是本申请实施例的内存垃圾回收的装置的示意性框图。图22的装置400可以执行上述图3中的内存垃圾回收的方法。该装置400包括:

存储器410,用于存储程序;

处理器420,用于执行存储器410中存储的程序,当该程序被执行时,所述处理器420具体用于:根据应用程序的标记节点以及所述标记节点的引用计数值,确定所述标记节点是否位于垃圾循环引用rc环中,其中,所述垃圾rc环中的节点均不存在外部引用;在所述标记节点位于所述垃圾rc环中时,对所述垃圾rc环中的节点进行回收。

可选地,作为一个实施例,所述处理器420具体用于:将当前节点的子节点的引用计数值减1,如果所述当前节点的子节点中出现引用计数值为0的第一目标子节点,则将所述第一目标子节点作为所述当前节点,重新执行本步骤,直到满足目标条件,如果所述当前节点的子节点中未出现所述第一目标子节点,则退出本步骤,其中,所述标记节点为所述当前节点的初始值,所述目标条件是所述当前节点的第一目标子节点中出现所述标记节点;在满足所述目标条件的情况下,确定所述标记节点位于所述垃圾rc环中。

可选地,作为一个实施例,所述处理器420还用于:在不满足所述目标条件的情况下,确定所述标记节点位于非垃圾rc环中;对所述当前节点以及所述当前节点的子节点的引用计数值进行恢复。

可选地,作为一个实施例,所述处理器420具体用于:将当前节点的子节点的引用计数值加1,如果所述当前节点的子节点中出现引用计数值为1的第二目标子节点,则将所述第二目标子节点作为所述当前节点,重新执行本步骤,如果所述当前节点的子节点中未出现所述第二目标子节点,则退出本步骤。

可选地,作为一个实施例,所述处理器420还用于:确定标记节点集合,其中,所述标记节点集合包含多个节点,所述标记节点为所述多个节点中的任意一个节点。

可选地,上述装置300和装置400具体可以是iot设备,或者其它内存资源有限的设备。

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

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

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