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

文档序号:9564495阅读:来源:国知局
象604。
[0051]在一些实施例中,程序员规定当过程重启时什么保留或丢弃。特别地,对那些应当在重启时保留的对象(例如,会话信息、用户数据、事务信息等)进行持久引用,并对那些不需要在重启时保留的对象(例如,历史信息、日志信息等)进行暂时引用。持久引用当它不再需要时从指向对象被移除,因此当重启时它不被保留。
[0052]实际上,过程状态通常包括确保顶层对象被引用的一个或多个根持久引用。其他对象被顶层对象引用并且引用又更多对象,从而形成树状对象图。因此,在一些实施例中,通过开始于对对象的根持久引用并将由根持久引用所引用的每个对象传递(例如,拷贝)至重启过程并且然后递归地传递由传递的对象所引用的所有对象以实现传递闭包来将备份过程状态提供至重启过程。
[0053]在一些实施例中,通过追踪针对原始过程的堆内存状态的增量更新来维持备份拷贝。图7是图示了针对过程的堆内存状态的增量更新的示例的内存状态图。在该示例中,在原始过程的执行期间,将针对原始过程的堆内存状态702的增量更新流送(例如,异步发送)至备份拷贝的堆内存状态704,因而维持大约为原始过程的内存状态的复制的备份拷贝,并确保该备份拷贝相对于当前过程状态合理地为最新的。例如,当在原始过程的内存状态702上对象0的属性从A变为V时,作为该改变的通知的更新消息被发送(例如,至执行过程自身),以使得相应地在备份拷贝上做出相同的更新。
[0054]在一些实施例中,备份拷贝使用类似在图1中所示的引用图进行表示。例如,备份拷贝可以被维持为具有反映原始过程状态的内存状态(堆状态)的引用的对象的内存实例。
[0055]该更新还可以包括针对对象的引用的删除,并因此可以导致一个或多个对象相对于根引用被解除引用,但仍存在于备份拷贝中。备份拷贝中的解除引用的对象不被重启过程所重建,这是因为如上文所述的,通过跟随用以定位对象的引用图中的引用的传递闭包而未发现对象。例如,如果仅从原始拷贝702删除对象0的引用,则对象0变成不被引用。关于该删除的消息被发送至备份拷贝704,其也将删除该引用并在备份拷贝中留下对象0为不被引用。当从备份拷贝中恢复状态时,不从备份拷贝中拷贝不被引用对象;因此,与此类对象关联的内存被回收。
[0056]在一些实施例中,系统状态在面向状态过程和面向处理过程之间进行划分。前者通常执行相对少的或受限的处理,而后者执行应用的大部分处理逻辑。例如,数据库过程可被视为面向状态过程,并且网络服务器过程可被视为面向处理过程。在一些实施例中,每个面向状态过程执行,同时将它的状态的增量更新流送至从这些增量更新维持该状态的复制内存中拷贝的备份过程。该复制也称为内存状态的备份拷贝。在一些实施例中,用于面向状态过程的回收内存包括使用故障转移(failover)过渡来重启该面向状态过程。
[0057]图8是图示了用于重启过程的流程的实施例的流程图。在该示例中,面向状态过程是原始过程。在802处,针对原始过程维持第一(现有的)备份过程。原始过程执行,同时将其过程状态的增量更新流送至第一备份过程,其将原始过程的内存状态的复制内存中拷贝维持为内存状态的第一备份拷贝,并基于更新调整第一备份拷贝。
[0058]当确定内存回收应当进行时(例如,当面向状态过程超过阈值内存使用等级时),为了到达回收点,故障转移过渡进行。在804处,创建第二备份过程。第二备份过程是针对将代替原始过程的第一备份过程的备份过程。第二备份过程仅利用现有过程状态中的被引用对象来初始化,其被反映在内存状态的第一备份拷贝中。在一些实施例中,通过跟随来自如早前所述的根持久引用的引用来实现该初始化。因此,任何不被引用对象(例如,在一个或多个更新期间其(一个或多个)持久引用已被删除的对象)不被包括在结果所得的第二备份过程状态中。因此,第二备份过程状态包括比第一备份过程状态更少的不被引用对象。在806处,转换第一备份过程以作为原始的面向状态过程的代替而执行。在一些实施例中,发信号给系统的剩余部分以将第一备份过程视为针对原始过程的代替。在808处,原始过程被终止并且对于回收的下一轮而言第一备份过程变为“原始过程”。
[0059]在一些实施例中,在过程800完成后,重复804-808,以使得第三备份过程被创建并且仅利用来自现有内存状态的被引用对象(其被反映在第二备份过程的内存状态中)而发起。第二备份过程作为第二备份过程的备份过程运行。第二备份过程变为代替过程并且第一备份过程被终止。此时,存在于原始面向状态过程中的不具有引用的所有对象都不继续存在于第二备份过程中,第二备份过程在第二次过渡后已经变成代替面向状态过程。
[0060]结合图9解释流程800。图9是图示了基于重启的回收过程中的过程状态的示例的数据图。在该示例中,原始过程状态为902。过程状态的第一备份拷贝904被维持作为原始内存状态的复制内存中实例(换句话说,备份拷贝被存储在内存中而不是磁盘上)。第一备份拷贝有具有反映原始过程的内存状态(堆状态)的引用的对象。在该示例中,在过程状态902中,对象910是仅具有暂时引用的栈上的对象。根据针对到达回收点的要求,对象910不反映在第一备份拷贝904上。对象912和914具有持久引用。根据这些要求,对象912和914被反映在第一备份拷贝904上。在执行期间,对912的持久引用被删除并且对象912变为不被引用。该增量更新被反映在第一备份拷贝904上,并且第一备份拷贝上的对象912也变为不被引用。
[0061]当重启原始过程时,创建第二备份过程。状态的第二备份拷贝906基于第一备份拷贝904中的被引用的对象而被实例化。第一备份拷贝904由第一备份过程直接使用,其充当接管原始过程的功能的执行过程。此时原始过程被终止。这样,第一备份拷贝904变成针对重启过程的新的主过程状态。第一备份拷贝904使与仅由暂时引用所引用的对象关联的内存被回收。例如,对象910不存在于备份拷贝904上。备份拷贝904还包括已经丢失其持久引用的某些对象(例如,对象912),并且此时不回收与这些对象关联的内存。因为在第二备份拷贝906中不重建诸如912的不被引用对象,所以当到达下一回收点时,与不被引用对象关联的内存变为被回收的。在下一回收点处,创建第三备份过程并且内存状态的第三备份拷贝908仅利用来自第二备份拷贝906的被引用对象而发起。第二备份拷贝906由重启过程直接使用。最新的过程状态不具有仅由暂时引用所引用的对象,并且不具有不被引用对象。换句话说,在两次过渡后实现面向状态过程的完全重启,其中第一过渡利用第一备份过程代替原始过程,然后第二过渡利用第二备份过程代替第一备份过程,以使得不被引用对象或仅由暂时引用所引用的对象不存在于当前的有效过程(即,第二备份过程)中。
[0062]在一些实施例中,面向状态过程及其备份过程的管理确保备份过程在比面向状态过程已经运行的更短的时间段内与面向状态过程同步运行。例如,如果原始的面向状态过程已经运行了 30秒,则第一备份仅在最近的15秒内运行并与该原始面向状态过程同步。因此,可以期望第一备份拷贝具有比原始更少的不具有引用的对象。假设对象以每秒一个对象的速率变得不被引用,那么原始过程在30秒时间段结束时将具有30个不被引用的对象,但是第一备份拷贝将仅具有在最近15秒之上累积的15个不被引用的对象。继续该示例,如果然后引起过渡以创建新的第二备份并且从原始故障转移至第一备份,则新的有效面向状态过程具有15秒的不被引用的对象的累积,而第二备份不具有不被引用的对象。在该示例中,假设对象以恒定速率变为不被引用,则每次故障转移过渡从该面向状态过程中的状态的立足点有效地回收一半不被引用的对象。进一步地,故障转移过渡的速率可以根据相对于故障转移过渡的成本的不被引用对象的累积的速率来控制。给定生成不被引用对象的特定速率以及累积不被引用对象的期望速率,可以确定故障转移过渡/重启的速率。故障转移过渡的更高速率将导致累积更少的不被引用对象但招致更高的故障转移过渡成本。
[0063]在一些实施例中,存在运行在系统中或应用中的多个面向状态过程。这些过程的持久状态共同形成系统或应用的持久状态。该持久状态被视为提交(commit)的或真实的状态。当重启时,面向处理过程从包含并维持其持久状态的面向状态过程恢复其过程内存状态。
[0064]在一些实施例中,在更新日志中记录增量更新,这与本领域中公知的重做日志类似。在此类情况下,一旦整个增量更新日志已被完全重放,则对于增量更新记录的重放可能的是使不被引用的对象被重建。然而,执行如上文图8和9中所示的多个故障转移操作可以除去该人工因素。
[0065]在一些实施例中,更新日志被实现为有效过程和该过程状态的备份拷贝之间的过程间通信连接。在此类情况下,当接收到日志更新记录时,日志更新记录可以被应用至备份拷贝,从而使得该备份拷贝为更加新的。
[0066]在一些实施例中,过程状态的备份拷贝由检查点机制(例如,在应用中使用特殊代码实现的)提供,其周期性地保存过程的当前状态。对于此类情况,在每个检查点处,保存的过程状态仅包括具有持久引用的对象或者仅持久引用的对象在重启过程中重建,这是通过如上文所述的那样开始于根引用并递归地跟随持久引用。
[0067]在一些实施例中,基于检查点和增量更新的组合来提供过程备份拷贝。在每个检查点处,对应的过程状态被保存,并且在检查点之间产生增量更新以使过程状态保持是最新的。当过程重启时,根据最近可用且完整的检查点加上自创建检查点以来发生的增量更新来恢复过程状态。在过程重启时重建的不被引用对象数由自最近检查点的时间以来被创建并且然后被删除的不被引用对象数所限制。
[0068]在一些实施例中,对堆内存的更新被封装在事务中,其中事务定义了一起提交或都不提交的改变集。在此类情况下,可以仅在事务提交时将更新应用至备份拷贝。因此,当恢复以及回收时,重启过程从最近提交的状态重新开始。
[0069]在一些实施例中,重启过程甚至可以在它已完全恢复原始过程的过程状态之前开始处理。例如,取决于处理需要,该过程可以按需加载针对远程对象的代理。代理可以为表示该对象的粧(stub)或壳(shell)但不包括与该对象关联的所有细节,诸如参数值。重启过程可以在不具有原始过程所具有的任何代理的情况下开始处理,从而推迟它们的实例化直到需要。
[0070]在一些实施例中,在重启过程期间,新过程和当前过程可以同时运行。尤其是,新过程在终止当前过程前启动。
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1