用于有效资源回收的延迟损毁的制作方法

文档序号:9564495阅读:371来源:国知局
用于有效资源回收的延迟损毁的制作方法
【专利说明】用于有效资源回收的延迟损毁
[0001]其他申请的交叉引用
[0002]本申请要求2014年3月12日提交的发明名称为“DEFERRED DESTRUCT1N FOREFFICIENT RESOURCE RECLAMAT1N”的第61/951,993号美国临时专利申请的优先权,所述临时专利申请通过引用出于所有的目的并入本文中。本申请还要求2014年3月18日提交的发明名称为 “DEFERRED DESTRUCT1N FOR EFFICIENT RESOURCE RECLAMAT1N” 的第61/955,096号美国临时专利申请的优先权,所述临时专利申请通过引用出于所有的目的并入本文中。
【背景技术】
[0003]在计算机系统中,内存一般被划分为大量对象,每个对象为内存分配和回收(reclaimat1n)的单元。当不存在针对对象的引用时,由该对象使用的内存被回收。进而,通常存在需要作为释放对象的一部分而进行的对象特定的处理。例如,对象可能引用其他对象并因此该对象特定的处理需要解除引用任何此类被引用的对象,并进而在其不再具有任何引用的情况下释放该已解除引用的对象。因而,对象损毁(destruct1n)可以潜在地导致其他对象被释放以及内存被回收的一连串过程(cascade)。对象特定的处理在C++和其他语言中由被称为损毁器的函数所规定。因而,它通常被称为对象损毁而不是内存回收,以赢得损毁器中的对象特定的回收关联的处理以及内存回收两者。如何在应用内充分且有效地执行对象损毁是一个有挑战性的问题。
[0004]过去,期望程序员明确地调用过程,例如,释放或删除以调用对象损毁。该手工方法易出错而且困难,这是因为它需要程序员知晓何时在应用的任何部分中都没有对该对象的其他引用。如果程序员规定的调用导致对象被损毁而它仍具有引用,则对内存的该已释放部分的随后访问可以导致该应用访问随机数据,这可能引起灾难性的故障。另一方面,如果当对象应当被损毁时程序员未能使其损毁,则通常对于该应用的使用期而言失去了该内存。此类内存漏出可能导致该应用随着时间的推移使用数量渐增的内存,这常常引起故障。此外,未及时地损毁的对象可能也持有其他资源,诸如锁定、打开的文件以及对其他对象的引用,这进一步浪费了系统资源。最后,该手工方法可能导致对象再次被释放,这也导致灾难性的程序故障。
[0005]—种可替换的方法是在每个对象中引入引用计数变量。然后,该字段当创建对该对象的新引用时递增,并且当移除引用时递减。然后,当该引用计数变为零时,该对象可以被回收。诸如C++的语言提供了半自动实现该引用计数并由此提供了对象的自动回收的通常被称为智能指针实现的机制。其还可以维持引用给定对象的其他对象的显式列表,但这与引用计数相比成本甚至更高。
[0006]图1是图示了被引用计数的对象的示例的数据结构图。在该引用图中,诸如101的边表示引用(例如,指针、句柄、标识符、地址和/或便于对象访问的另一适当机制)。对于每个对象,对应的引用计数值指示对该对象的引用数目。例如,对象104具有对它的3个引用,即由对象102、103和105。
[0007]引用计数法招致了显著的开销,这是因为需要维持对象的准确引用计数,并且每次当对象被引用或解除引用时,都必须调用引用计数操作。当递增和递减操作需要为原子级时(如在多线程环境中所需要的那样)并因此需要诸如内存栅栏操作之类的昂贵的硬件指令时,开销尤其显著。对于引用计数的进一步担忧是当解除引用对象时可能发生的无法预测的开销。特别地,解除引用随后被损毁的对象可能导致具有关联开销的对象损毁的不受限的一连串过程。对于引用计数的另一担忧是循环引用结构可能意味着在循环图中彼此引用的一组对象对于该应用的其余部分是不可达的,但它们的引用计数不会变为零,因此该对象不能被回收。
[0008]对象损毁的另一种方法是提供所谓的无用单元收集(GC)机制,该机制周期性运行以发现不再具有任何引用的对象并损毁这些对象。这避免了引用计数的开销,但招致了扫描内存来定位对每个对象的所有引用以标识不再具有引用的那些对象的显著的成本。
[0009]图2是图示了分代(generat1nal)GC示例的图。在此图中,内存被划分为三部分:过程栈(stack) 202、较新的(例如,最近创建的)对象204以及较旧的对象206。在一些实现中,通常情况下仅扫描包含最近创建的对象的段是足够的,这是因为大多数对象在创建后很快丢失所有它们的引用。
[0010]在大内存的情况下,该GC任务可能需要大约几分钟或更长的时间来完成,这相当大地干扰了应用的响应和进度。考虑由于GC任务延迟可能存在大量未引用但也未回收的内存,应用为了运行常常需要增加的内存量。结果所得的数量较大的内存增大了资源需要并因此提高了运行该应用的成本。虽然诸如所谓的分代无用单元收集之类的技术设法减少对回顾所有内存的需要,但是它们依赖于某些应用行为,所述应用行为可能导致无法预测的性能,这是因为这些行为随着尺度而改变。此外,许多无用单元收集技术需要内存压缩,这伴有重新部署内存中的许多对象,其中进一步伴随对应用处理的开销并且干扰应用处理。
[0011]应用内存需要正在增长,因此所有这些成本也在增加。回收方案的复杂度也在相应增加,从而引入不可预测的性能并且在一些情况下对应用执行引入故障。需要的是不易出错的损毁对象的有效方式。
【附图说明】
[0012]在下文的【具体实施方式】和附图中公开了本发明的各实施例。
[0013]图1是图示了引用计数对象的示例的数据结构图;
[0014]图2是图示了分代GC示例的图。
[0015]图3是图示了内存回收过程的实施例的流程图。
[0016]图4是图示了具有持久引用和/或暂时引用的内存中的对象的实施例的数据结构图。
[0017]图5A是图示了用于使用基于重启的内存回收来到达回收点的过程的实施例的流程图。
[0018]图5B是图示了用于重启原始过程的过程的实施例的流程图。
[0019]图5C是图示了用于从备份拷贝中恢复过程状态的过程的实施例的流程图。
[0020]图6是图示了基于重启的回收过程中的过程状态的示例的图。
[0021]图7是图示了针对过程的堆(heap)内存状态的增量更新的示例的内存状态图。
[0022]图8是图示了用于重启过程的流程的实施例的流程图。
[0023]图9是图示了基于重启的回收过程中的过程状态的示例的数据图。
[0024]图10A是图示了用于创建和使用用于回收的损毁列表的过程的实施例的流程图。
[0025]图10B是图示了损毁列表迭代器过程的实施例的流程图。
[0026]图11A是图示了一般字符串实现的数据结构图。
[0027]图11B是图示了针对字符串的不同实现的数据结构图。
[0028]图12是图示了依据一些实施例在其上执行内存回收的已编程计算机系统的功能图。
【具体实施方式】
[0029]本发明可以以多种方式实现,包括作为:过程;装置;系统;组合物;具体化在计算机可读存储介质上的计算机程序产品;和/或处理器,诸如配置为执行在耦合至处理器的存储器上存储的和/或由耦合至处理器的存储器提供的指令。在本说明书中,这些实现或本发明可以采取的任何其他形式可以称为技术。一般而言,所公开过程的步骤的次序可以在本发明的范围内更改。除非另有声明,描述为被配置成执行任务的诸如处理器或内存的组件可以被实现为在给定时间临时配置为执行该任务的一般组件或被制造为执行该任务的特定组件。如本文所使用的,术语“处理器”是指配置为处理数据的一个或多个设备、电路、和/或处理核,诸如计算机程序指令。
[0030]下文,与图示本发明的原理的附图一起提供了本发明的一个或多个实施例的详细描述。与这些实施例有关地对本发明进行描述,但本发明并不限于任何实施例。本发明的范围仅受权利要求的限制并且本发明包括多种替换方案、修改方案和等同方案。下文的描述中阐述了多种特定细节以便提供对本发明的透彻理解。这些细节出于例示的目的而被提供,并且本发明可以在不具有这些特定细节的一些或所有的情况下根据权利要求进行实施。出于清楚的目的,未详细描述涉及本发明的本技术领域中公知的技术材料,以免不必要地使本发明晦涩难懂。
[0031]公开了基于对象的延迟损毁的内存管理。在一些实施例中,执行具有多个对象的过程。这些对象可通过引用访问。引用的示例包括指针、标识符、句柄或用于访问内存中对象的其他适当的结构。在该过程执行期间的各点处,一些引用是暂时引用并且一些引用是持久引用。如本文所使用的,暂时引用是在短时间段内存在的引用,通常仅在过程的执行期间。例如,暂时引用可以作为存储在过程执行期间的线程的过程栈上的局部变量中的针对对象的指针而出现。因此,此类引用仅当线程执行该过程时存在。与此相反,持久引用在较长的时间段内存在。持久引用通常存储在全局变量中或者在过程内存堆或分配的存储器中存储的对象的字段中。因此,它持续直至该引用被改写或者该内存被回收。通常,持久引用仅被允许引用存储在内存堆中的对象。如将更详细描述的那样,暂时引用通常不被记录,并且持久引用通常被记录(例如,使用引用计数进行追踪)。在一些实施例中,程序员通过规定引用的行为来确定它应当为暂时的还是持久的。在一些实施例中,编译器通过分别识别引用是引用堆栈上的局部变量还是过程内存堆上的对象来识别该引用是暂时的还是持久的,并相应地管理该引用及其关联的内存。
[0032]在本文描述的实施例中,存在被称为回收点的时间点,在这些点处暂时引用不存在(换句话说,暂时引用被解除分配或设置为空)或仅存在于已知位置处。当到达回收点时,不具有持久引用和暂时引用的对象被损毁。在一些实施例中,持久引用被记录并且暂时引用不被记录(例如,持久引用导致对象的引用计数递增,并且暂时引用不导致引用计数递增),而使得在回收点处,通过持久引用所引用的对象不被损毁/在过程重启后重建。在一些实施例中,作为使用引用计数的代替,以仅持久对象可从持久根到达的并在过程重启后重建的方式创建对象。
[0033]图12是图示了根据一些实施例在其上执行内存回收的已编程计算机系统的功能图。如将明显的,其他计算机系统架构和配置也可以用于执行内存回收。包括如下文所述的各
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1