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

文档序号:9564495阅读:来源:国知局
新过程从备份中恢复现有的过程状态;同时,当前过程仍在运行,并继续进行增量更新以及将增量更新按需传送至备份拷贝直到新过程已经从备份中恢复现有的过程状态。此时,备份进一步将它已经从当前过程接收到的任何剩余的更新传送至新过程,当前过程被中止或终止,并且由新过程接管。例如,当新过程开始时,备份具有持久引用的对象A和B。新过程通过拷贝对象A和B来恢复现有的过程状态;在新过程完成A和B的拷贝前,当前过程同时创建新的持久引用对象C。当前过程将增量更新(对象C的创建)传送至备份拷贝。一旦新过程完成拷贝A和B,则当前过程被中止或终止,并且备份拷贝将对象C的创建通知给新过程,新过程也将创建所述对象C。一旦新过程完成拷贝对象C,则新过程接管。在此类情况下,重启可以视为将计算从原始过程迀移至新过程。该方法最小化对应用执行的中断,S卩,旧过程停止执行和新过程接管之间的时间。
[0071]在一些实施例中,在回收点处,当前过程可以重置其内存状态并从备份拷贝重建该状态而不是终止当前过程并启动新过程,从而节约终止该过程并实例化新过程的成本。
[0072]在一些实施例中,在回收点之间使用基于代的对象追踪而不是创建过程状态的单独备份拷贝。以与公知的分代无用单元收集技术相似的方式,当前过程创建对象并追踪对象的单独的代,这与图2所示的内容相似。此外,较旧的对象被维持在跨过程重启而保留的单独的内存段中。在一些实施例中,在回收点处并当重启新过程时,用于较旧对象的单独内存段被映射至新过程的地址空间,以使得较旧的对象在不改变的情况下可用于新过程。该映射可以使用本领域技术人员公知的操作系统支持的内存共享功能来实现。针对新过程重建更年轻的(即,在最近的回收周期后创建的)并且保持在与较旧的对象不同的内存区域中的对象,并使用上述技术回收该对象。可选地,在每个回收点处,在幸免于回收的持久引用对象将变得“旧化(age)”并存储在用于较旧对象的保留的代内存段中。该方法是有效的,这是因为较旧的对象趋于以比更年轻的对象更高的速率持久引用。使用该方法,减少了重建较旧对象的成本,从而实现与分代无用单元收集相似的好处。在一些实施例中,上述回收/重启周期是次要回收周期。与分代无用单元收集类似,除了次要回收周期外,可以存在以比一般过程重启更低的频率发生的主要周期,其中使用与上文所述的相同技术回收针对较旧对象的单独内存段。例如,较旧对象的备份拷贝可以用于重建持久引用对象,并且可以释放针对较旧对象的单独内存段。相似的方法可以用于保留某些资源(诸如网络连接),而不是释放这些资源并当过程重启时重新获取它们。
[0073]在一些实施例中,某些引用可以进一步区分为弱引用或强引用。如本文所使用的,弱引用是不防止对象被损毁的引用,并可以由操作系统或应用设置为空。注意,从程序员的观点来看,弱引用不同于暂时引用。弱引用不防止对象被损毁,但是当对象被损毁时被设置为空。相反地,暂时引用确实防止对象被损毁。例如,子对象可以具有对其父对象的弱引用,以使得如果父对象不再由除了子对象之外的任何其他对象引用,则可以损毁父和子对象两者。在此类情况下,当重启时,针对其仅存在弱引用的对象不被重建并且针对该对象的任何弱引用被设置为空。
[0074]在另一方面,操作系统检查内存使用率,并且当过程到达配置的内存限制时回收被触发。许多操作系统提供规定对给定过程可以使用的内存量的限制的能力。当过程到达该限制时,由该过程的任何内存分配请求将被拒绝,或者操作系统可以简单地终止该过程。在任何情况下,回收作为重启的一部分而发生,这如上文所述的那样。
[0075]在一些实施例中,基于应用特定的负载测量来动态调整内存限制。例如,如果过程正在处理N个用户,则应用可以被编程以估计针对处理N个用户严格所需的内存量,例如K*N兆字节(其中K是每用户需要的内存量),并将内存限制调整为新的值,诸如2K*N兆字节。因此,当该过程使用处理其提供的负载严格所需的内存的两倍时,使该过程重启。在该示例中,该限制与用户数成比例。可以使用其他限制函数。该内存开销相当于针对许多无用单元收集系统报告的但是在不具有无用单元收集开销的情况下实现的开销。
[0076]在容错系统中,上文所述的回收技术不仅使用现有的机制(即过程重启),而且还确保该机制频繁运用,从而改善当故障发生时该机制工作的可能性。相反地,它消除了具有需要额外测试并且可能成为单独故障源的单独内存回收机制。该回收技术还避免了正在进行的内存残片。内存被有效压缩为重启的部分。该回收技术可以用于当由于主机限制而到达内存限制时将过程移动至新的主机。此外,在终止原始过程前创建新重启过程的情况下,对应用执行的干扰被最小化。
[0077]基于损毁列表的回收
[0078]如上文所讨论,在一些实施例中,由于为针对持久对象的持久引用计数维持有记录,所以持久引用被说成被记录。例如,可以存在指示与该对象关联的持久引用数的引用计数字段。暂时引用不记录,原因在于它不维持或影响引用计数。进一步地,在一些实施例中,存在回收数据结构,诸如作为(延迟)损毁的候选者的对象的列表。该列表被称为损毁列表。
[0079]图10A是图示了用于创建并使用用于回收的损毁列表的过程的实施例的流程图。当从对象移除持久引用时,发起过程1000。在1002处,确定对象的持久引用计数已到达0。因此,在1004处,对该对象的引用(例如,指针)被添加至回收数据结构(例如,损毁列表)。可以针对许多对象重复过程1000。随后,当周期性地到达回收点时或响应于过程到达内存大小阈值,任务线程在该损毁列表之上迭代。
[0080]图10B是图示了损毁列表迭代器过程的实施例的流程图。在1502处,确定对象是否具有引用计数0。损毁列表上的对象可以具有非零引用计数,如果其引用计数在对象被添加至损毁列表后递增的话。如果引用计数为非零,则在1504处,该对象从损毁列表中删除;否则,执行对象特定的处理。特别地,在1506处调用对象的损毁器。在1508处,对象的损毁器解除引用被该对象所引用的其他对象,并将具有0引用计数的任何不被引用对象添加至损毁列表。在1510处,释放该对象的内存。如果下一对象可用,则由迭代器针对损毁列表中的下一对象重复过程1500。
[0081]在一些实施例中,通过要求每个线程周期性产生(其中在其栈上不具有暂时引用状态)并且移除不被引用对象来到达回收点。在多线程过程中,可以通过实现栅障(barrier)同步技术到达回收点,所述栅障同步技术使得所有线程在栅障处等待直到所有线程均准备好继续进行。栅障同步技术对于本领域技术人员是公知的。为了回收内存,在栅障处,线程移除不被引用的对象。在其中处理被划分为其中在每个回合处线程必须一起继续进行的回合(称为基于回合的计算)的应用中,此类栅障将已经由应用所需要。因此,当存在足够的未回收的内存来证明执行该回收是合理的时,回合障碍还可以用作回收点的目的。
[0082]在一些实施例中,可以允许线程在不处于内存堆中的已知位置中保留某一数量的暂时引用。该回收处理然后必须觉知到这些引用并在回收期间将这些引用视为对该对象的有效持久的引用。换句话说,不回收与由已知位置中的暂时引用所引用的这些对象关联的内存。
[0083]在上文的示例中,在回收点处,不存在仅由暂时引用所引用的对象。在一些实施例中,在回收点处,只要能够容易地发现对这些对象的暂时引用,就允许仅由暂时引用所引用的对象存在;例如,如果暂时引用可以在不必针对它们进行搜索的情况下被直接访问的话,这是因为暂时引用仅位于规定位置处。换句话说,当损毁线程/损毁列表迭代器时常地运行以处理损毁列表上的对象时,它能够定位规定位置处的任何暂时引用并特别对待这些暂时引用。尤其是,当对象的持久引用计数为0时,检查规定位置处的对象的暂时引用的存在。仅在规定位置处未发现存在暂时引用的情况下,损毁该对象并且释放其内存。
[0084]在一些实施例中,可以使用基于重启回收和损毁列表回收两者。优选地,基于重启的回收响应于内存残片、循环引用以及损毁列表上未列出的对象而不常被调用,而基于损毁列表的回收被用于减少重启之间的内存消耗,或者相反地在不消耗过多的内存量的情况下允许重启之间的更长时间段。
[0085]针对延迟损毁的优化
[0086]延迟损毁避免需要记录针对对象的暂时引用。然而,它确实意味着内存堆中的对象可以比使用立即损毁的情况更长地继续消耗资源。为了减少该成本,若干改良是可行的。
[0087]具有延迟损毁的立即终十
[0088]具有响应于对象状态自身的改变而回收的一些资源是可行的。例如,执行计算的对象可以在该对象中具有一些被设置为指示其操作模式的属性字段。客户(例如,对象的使用者)然后可以将该属性设置为“终止”以指示它应当停止计算并释放资源。与该字段关联的过程可以被触发并释放由该对象正在使用的计算资源,而不损毁该对象。相似地,可以响应于相同或相似的对象修改而释放锁定、打开的文件、网络连接以及其他资源。
[0089]在一些实施例中,可以通过如上文所述的那样将该属性设置为“终止”来触发从父收集或其他收集中的删除,在该对象上仅需要的用以触发该关闭和回收处理的应用动作是将关联的属性设置为“终止”。该方法被称为基于属性的终止。
[0090]基于属性的终止方法允许通过写入该属性而触发的对象活动和某些资源消耗的立即终止。相反地,如果这些动作仅在损毁时执行,则即使当对象不具有引用时立即发起损毁,该动作也会被保留对该“终止”对象的引用的一些对象延迟得太久。程序员难以确保在相对短的时间量内移除所有引用。该方法可以被提供为指示对象的操作状态的通用属性的部分,状态值包括例如“初始化”、“运行”和“待机”,以及“终止”。因此,当用于指示立即资源释放时它不会强加任何额外的消耗,如本文的焦点,这是因为在任何情况下均需要对基于属性的处理的支持。进而,该方法允许其他对象对该属性做出与其他属性相同的反应以移除它们对所述对象的引用或其他相关处理,从而迅速识别何时对象不再具有功能或不被需要。使用该方法,实际的对象损毁具有最少的应用语义或不具有应用语义,这是因为在该损毁处发生的仅有的真实处理是内存回收和解除引用。
[0091 ] 在一些实施例中,作为基于属性的终止的代替,可以从一些收集中删除对象,从而导致识别该对象改变并释放该对象然后不再需要的任何资源的过程被触发。此类删除通常需要对对象自身的相似修改,这是因为对象包含当删除时清除的对收集的后指针。可以在该修改时
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1