CN105320567A - 用于有效资源回收的延迟损毁 - Google Patents
用于有效资源回收的延迟损毁 Download PDFInfo
- Publication number
- CN105320567A CN105320567A CN201510212579.2A CN201510212579A CN105320567A CN 105320567 A CN105320567 A CN 105320567A CN 201510212579 A CN201510212579 A CN 201510212579A CN 105320567 A CN105320567 A CN 105320567A
- Authority
- CN
- China
- Prior art keywords
- quote
- temporarily
- procedure
- quoted
- backup
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0261—Garbage collection, i.e. reclamation of unreferenced memory using reference counting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/14—Error detection or correction of the data by redundancy in operation
- G06F11/1402—Saving, restoring, recovering or retrying
- G06F11/1415—Saving, restoring, recovering or retrying at system level
- G06F11/1438—Restarting or rejuvenating
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Retry When Errors Occur (AREA)
- Library & Information Science (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及用于有效资源回收的延迟损毁。内存回收包括:执行具有多个对象的过程,所述对象可经由多个引用而访问,所述多个引用的至少一些为暂时引用,所述多个引用的至少一些为持久引用;到达回收点,在所述回收点处过程状态不具有暂时引用或仅在已知位置处具有暂时引用;以及在回收点处损毁不具有持久引用并且不具有暂时引用的对象。
Description
其他申请的交叉引用
本申请要求2014年3月12日提交的发明名称为“DEFERREDDESTRUCTIONFOREFFICIENTRESOURCERECLAMATION”的第61/951,993号美国临时专利申请的优先权,所述临时专利申请通过引用出于所有的目的并入本文中。本申请还要求2014年3月18日提交的发明名称为“DEFERREDDESTRUCTIONFOREFFICIENTRESOURCERECLAMATION”的第61/955,096号美国临时专利申请的优先权,所述临时专利申请通过引用出于所有的目的并入本文中。
背景技术
在计算机系统中,内存一般被划分为大量对象,每个对象为内存分配和回收(reclaimation)的单元。当不存在针对对象的引用时,由该对象使用的内存被回收。进而,通常存在需要作为释放对象的一部分而进行的对象特定的处理。例如,对象可能引用其他对象并因此该对象特定的处理需要解除引用任何此类被引用的对象,并进而在其不再具有任何引用的情况下释放该已解除引用的对象。因而,对象损毁(destruction)可以潜在地导致其他对象被释放以及内存被回收的一连串过程(cascade)。对象特定的处理在C++和其他语言中由被称为损毁器的函数所规定。因而,它通常被称为对象损毁而不是内存回收,以赢得损毁器中的对象特定的回收关联的处理以及内存回收两者。如何在应用内充分且有效地执行对象损毁是一个有挑战性的问题。
过去,期望程序员明确地调用过程,例如,释放或删除以调用对象损毁。该手工方法易出错而且困难,这是因为它需要程序员知晓何时在应用的任何部分中都没有对该对象的其他引用。如果程序员规定的调用导致对象被损毁而它仍具有引用,则对内存的该已释放部分的随后访问可以导致该应用访问随机数据,这可能引起灾难性的故障。另一方面,如果当对象应当被损毁时程序员未能使其损毁,则通常对于该应用的使用期而言失去了该内存。此类内存漏出可能导致该应用随着时间的推移使用数量渐增的内存,这常常引起故障。此外,未及时地损毁的对象可能也持有其他资源,诸如锁定、打开的文件以及对其他对象的引用,这进一步浪费了系统资源。最后,该手工方法可能导致对象再次被释放,这也导致灾难性的程序故障。
一种可替换的方法是在每个对象中引入引用计数变量。然后,该字段当创建对该对象的新引用时递增,并且当移除引用时递减。然后,当该引用计数变为零时,该对象可以被回收。诸如C++的语言提供了半自动实现该引用计数并由此提供了对象的自动回收的通常被称为智能指针实现的机制。其还可以维持引用给定对象的其他对象的显式列表,但这与引用计数相比成本甚至更高。
图1是图示了被引用计数的对象的示例的数据结构图。在该引用图中,诸如101的边表示引用(例如,指针、句柄、标识符、地址和/或便于对象访问的另一适当机制)。对于每个对象,对应的引用计数值指示对该对象的引用数目。例如,对象104具有对它的3个引用,即由对象102、103和105。
引用计数法招致了显著的开销,这是因为需要维持对象的准确引用计数,并且每次当对象被引用或解除引用时,都必须调用引用计数操作。当递增和递减操作需要为原子级时(如在多线程环境中所需要的那样)并因此需要诸如内存栅栏操作之类的昂贵的硬件指令时,开销尤其显著。对于引用计数的进一步担忧是当解除引用对象时可能发生的无法预测的开销。特别地,解除引用随后被损毁的对象可能导致具有关联开销的对象损毁的不受限的一连串过程。对于引用计数的另一担忧是循环引用结构可能意味着在循环图中彼此引用的一组对象对于该应用的其余部分是不可达的,但它们的引用计数不会变为零,因此该对象不能被回收。
对象损毁的另一种方法是提供所谓的无用单元收集(GC)机制,该机制周期性运行以发现不再具有任何引用的对象并损毁这些对象。这避免了引用计数的开销,但招致了扫描内存来定位对每个对象的所有引用以标识不再具有引用的那些对象的显著的成本。
图2是图示了分代(generational)GC示例的图。在此图中,内存被划分为三部分:过程栈(stack)202、较新的(例如,最近创建的)对象204以及较旧的对象206。在一些实现中,通常情况下仅扫描包含最近创建的对象的段是足够的,这是因为大多数对象在创建后很快丢失所有它们的引用。
在大内存的情况下,该GC任务可能需要大约几分钟或更长的时间来完成,这相当大地干扰了应用的响应和进度。考虑由于GC任务延迟可能存在大量未引用但也未回收的内存,应用为了运行常常需要增加的内存量。结果所得的数量较大的内存增大了资源需要并因此提高了运行该应用的成本。虽然诸如所谓的分代无用单元收集之类的技术设法减少对回顾所有内存的需要,但是它们依赖于某些应用行为,所述应用行为可能导致无法预测的性能,这是因为这些行为随着尺度而改变。此外,许多无用单元收集技术需要内存压缩,这伴有重新部署内存中的许多对象,其中进一步伴随对应用处理的开销并且干扰应用处理。
应用内存需要正在增长,因此所有这些成本也在增加。回收方案的复杂度也在相应增加,从而引入不可预测的性能并且在一些情况下对应用执行引入故障。需要的是不易出错的损毁对象的有效方式。
附图说明
在下文的具体实施方式和附图中公开了本发明的各实施例。
图1是图示了引用计数对象的示例的数据结构图;
图2是图示了分代GC示例的图。
图3是图示了内存回收过程的实施例的流程图。
图4是图示了具有持久引用和/或暂时引用的内存中的对象的实施例的数据结构图。
图5A是图示了用于使用基于重启的内存回收来到达回收点的过程的实施例的流程图。
图5B是图示了用于重启原始过程的过程的实施例的流程图。
图5C是图示了用于从备份拷贝中恢复过程状态的过程的实施例的流程图。
图6是图示了基于重启的回收过程中的过程状态的示例的图。
图7是图示了针对过程的堆(heap)内存状态的增量更新的示例的内存状态图。
图8是图示了用于重启过程的流程的实施例的流程图。
图9是图示了基于重启的回收过程中的过程状态的示例的数据图。
图10A是图示了用于创建和使用用于回收的损毁列表的过程的实施例的流程图。
图10B是图示了损毁列表迭代器过程的实施例的流程图。
图11A是图示了一般字符串实现的数据结构图。
图11B是图示了针对字符串的不同实现的数据结构图。
图12是图示了依据一些实施例在其上执行内存回收的已编程计算机系统的功能图。
具体实施方式
本发明可以以多种方式实现,包括作为:过程;装置;系统;组合物;具体化在计算机可读存储介质上的计算机程序产品;和/或处理器,诸如配置为执行在耦合至处理器的存储器上存储的和/或由耦合至处理器的存储器提供的指令。在本说明书中,这些实现或本发明可以采取的任何其他形式可以称为技术。一般而言,所公开过程的步骤的次序可以在本发明的范围内更改。除非另有声明,描述为被配置成执行任务的诸如处理器或内存的组件可以被实现为在给定时间临时配置为执行该任务的一般组件或被制造为执行该任务的特定组件。如本文所使用的,术语“处理器”是指配置为处理数据的一个或多个设备、电路、和/或处理核,诸如计算机程序指令。
下文,与图示本发明的原理的附图一起提供了本发明的一个或多个实施例的详细描述。与这些实施例有关地对本发明进行描述,但本发明并不限于任何实施例。本发明的范围仅受权利要求的限制并且本发明包括多种替换方案、修改方案和等同方案。下文的描述中阐述了多种特定细节以便提供对本发明的透彻理解。这些细节出于例示的目的而被提供,并且本发明可以在不具有这些特定细节的一些或所有的情况下根据权利要求进行实施。出于清楚的目的,未详细描述涉及本发明的本技术领域中公知的技术材料,以免不必要地使本发明晦涩难懂。
公开了基于对象的延迟损毁的内存管理。在一些实施例中,执行具有多个对象的过程。这些对象可通过引用访问。引用的示例包括指针、标识符、句柄或用于访问内存中对象的其他适当的结构。在该过程执行期间的各点处,一些引用是暂时引用并且一些引用是持久引用。如本文所使用的,暂时引用是在短时间段内存在的引用,通常仅在过程的执行期间。例如,暂时引用可以作为存储在过程执行期间的线程的过程栈上的局部变量中的针对对象的指针而出现。因此,此类引用仅当线程执行该过程时存在。与此相反,持久引用在较长的时间段内存在。持久引用通常存储在全局变量中或者在过程内存堆或分配的存储器中存储的对象的字段中。因此,它持续直至该引用被改写或者该内存被回收。通常,持久引用仅被允许引用存储在内存堆中的对象。如将更详细描述的那样,暂时引用通常不被记录,并且持久引用通常被记录(例如,使用引用计数进行追踪)。在一些实施例中,程序员通过规定引用的行为来确定它应当为暂时的还是持久的。在一些实施例中,编译器通过分别识别引用是引用堆栈上的局部变量还是过程内存堆上的对象来识别该引用是暂时的还是持久的,并相应地管理该引用及其关联的内存。
在本文描述的实施例中,存在被称为回收点的时间点,在这些点处暂时引用不存在(换句话说,暂时引用被解除分配或设置为空)或仅存在于已知位置处。当到达回收点时,不具有持久引用和暂时引用的对象被损毁。在一些实施例中,持久引用被记录并且暂时引用不被记录(例如,持久引用导致对象的引用计数递增,并且暂时引用不导致引用计数递增),而使得在回收点处,通过持久引用所引用的对象不被损毁/在过程重启后重建。在一些实施例中,作为使用引用计数的代替,以仅持久对象可从持久根到达的并在过程重启后重建的方式创建对象。
图12是图示了根据一些实施例在其上执行内存回收的已编程计算机系统的功能图。如将明显的,其他计算机系统架构和配置也可以用于执行内存回收。包括如下文所述的各种子系统的计算机系统1200包括至少一个微处理器子系统(也被称为处理器或中央处理单元(CPU))1202。例如,处理器1202可以由单芯片处理器或由多个处理器实现。在一些实施例中,处理器1202是控制计算机系统1200的操作的通用数字处理器。使用从内存1210检索的指令,处理器1202控制输入数据的接收和操纵,以及输出设备(例如,显示器1218)上的数据的输出和显示。在一些实施例中,处理器1202和内存1210被用于提供内存回收功能。
处理器1202与内存1210双向耦合,所述内存1210可以包括第一主存储器,通常为随机存取存储器(RAM)以及第二主存储区域,通常为只读存储器(ROM)。如本领域中公知的那样,主存储器可以被用作通用存储区域并且用作高速暂存存储器,并且也可以被用于存储输入数据和已处理的数据。除了用于在处理器1202上操作的过程的其他数据和指令外,主存储器还可以以数据对象和文本对象的形式存储编程指令和数据。同样如本领域中公知的,主存储器通常包括基本操作指令、程序代码、数据、以及被处理器1202用来执行其功能的对象(例如,已编程指令)。例如,内存1210可以包括任何合适的计算机可读存储介质(在下文描述),这取决于例如数据访问是否需要是双向的还是单向的。例如,处理器1202还可以在高速缓存存储器(未示出)中直接并且非常迅速地检索和存储频繁需要的数据。
可移除大容量存储设备1212为计算机系统1200提供额外的数据存储能力,并要么双向(读/写)要么单向(只读)耦合至处理器1202。例如,存储器1212还可以包括计算机可读介质,诸如磁带、闪存、PC卡、便携式大容量存储设备、全息存储设备和其他存储设备。固定大容量存储器1220还可以例如提供额外的数据存储能力。大容量存储器1220的最常见的示例是硬盘驱动器。大容量存储器1212、1220通常存储通常不处于由处理器1202的有效使用的额外的编程指令、数据等等。将理解的是,大容量存储器1212和1220内保持的信息可以以标准方式作为内存1210(例如,RAM)的部分而合并为虚拟内存,如果需要的话。
除了向处理器1202提供对存储子系统的访问外,总线1214还可以被用于提供对其他子系统和设备的访问。如所示出的,这些可以包括显示监视器1218、网络接口1216、键盘1204、以及定点设备1206,以及辅助输入/输出设备接口、声卡、扬声器以及根据需要的其他子系统。例如,定点设备1206可以为鼠标、触控笔、轨迹球、或触控板,并且对于与图形用户接口进行交互而言是有用的。
网络接口1216允许处理器1202使用如示出的网络连接而耦合至另一计算机、计算机网络、或通讯网络。例如,通过网络接口1216,处理器1202可以在执行方法/过程步骤的过程中从另一网络接收信息(例如,数据对象或程序指令)或者向另一网络输出信息。通常表示为要在处理器上执行的一系列指令的信息可以从另一网络接收或输出至另一网络。接口卡或相似设备以及由处理器1202实现的(例如,在其上执行/运行的)适当软件可以用于将计算机系统1200连接至外部网络并根据标准协议传输数据。例如,本文公开的多种过程实施例可以在处理器1202上被执行,或者可以连同共享该处理的一部分的远程处理器一起跨诸如因特网、内部网或者局域网的网络被执行。额外的大容量存储设备(未示出)还可以通过网络接口1216连接至处理器1202。
辅助I/O设备接口(未示出)可以连同计算机系统1200一起使用。辅助I/O设备接口可以包括一般和定制的接口,其允许处理器1202向其他设备发送或更通常地从其他设备接收数据,所述其他设备诸如麦克风、触敏显示器、换能器读卡器、磁带读取器、声音或手写识别器、生物计量读取器、摄像机、便携式大容量存储设备以及其他计算机。
此外,本文公开的各种实施例进一步涉及具有包括用于执行各种计算机实现的操作的程序代码的计算机可读介质的计算机存储产品。计算机可读介质是可以存储之后可以由计算机系统读取的数据的任何数据存储设备。计算机可读介质的示例包括但不限于所有上文所述的介质:诸如硬盘、软盘以及磁带之类的磁性介质;诸如CD-ROM盘之类的光学介质;诸如光盘之类的磁光介质;以及特定配置的硬盘设备,诸如专用集成电路(ASIC)、可编程逻辑设备(PLC)以及ROM和RAM设备。程序代码的示例包括例如由编译器产生的机器代码或者包含可以使用解释器执行的更高级代码(例如,脚本)的文件两者。
图12中所示的计算机系统仅为适于与本文中公开的多种实施例一起使用的计算机系统的示例。适于此类使用的其他计算机系统可以包括额外的或更少的子系统。此外,总线1214是用于链接子系统的任何互连方案的说明。也可以利用具有不同配置的子系统的其他计算机架构。
图3是图示了内存回收过程的实施例的流程图。过程300可以在诸如图12的1200的系统上执行。在302处,具有多个对象的过程进行执行。特别地,可经由多个引用访问这些对象。多个引用中的至少一些为暂时引用,并且多个引用中的至少一些为持久引用。在304处,到达回收点,在该点处不存在暂时引用或仅在已知位置处存在暂时引用。下文更详细地描述了如何到达回收点。例如,当该过程的内存使用超过阈值并且该过程重启时,可以到达回收点。在306处,在回收点处,不具有持久引用和暂时引用的对象被损毁。
图4是图示了具有持久引用和/或暂时引用的内存中的对象的实施例的数据结构图。如所示的,使用虚线(诸如401)画出的边表示暂时引用,并且使用实线(诸如407)画出的边表示持久引用。在该示例中,对象的引用计数仅对引用该对象的持久引用数进行计数。在示出的示例中,暂时引用处于过程栈上。特别地,暂时引用401和402是分别由过程F和G使用的栈上的变量。当完成过程F和G时,从该栈上移除它们各自的暂时引用。相应地,到达回收点,并且回收过程开始回收内存。在回收点处,具有引用计数0且不具有暂时引用的对象404要被回收。对象403由于不具有持久引用所以具有引用计数0,并且不再具有暂时引用,这是因为过程G已完成并且暂时引用402已被移除。这样,对象403将被回收。具有持久引用(并因此引用计数>0)的对象402不被回收。应注意在一些实施例(未示出)中,在回收点处,可允许暂时引用存在于已知位置处。如果存在此类暂时引用,则它们被视为持久引用并且被此类暂时引用所引用的任何对象都不被回收。在下文更完整描述了回收的细节。
基于重启的回收
在一些实施例中,通过利用现有的容错系统所需要的过程重启机制(例如,过程管理器、操作系统等)来实现内存回收。图5A是图示了用于使用基于重启的内存回收来到达回收点的过程的实施例的流程图。
流程500被用于到达回收点并可以被用于实现304过程300。在该示例中,正在执行并经受内存回收的过程具有过程状态。如本文所使用的,过程状态是指在过程的状态下要做的一切,诸如内存状态、栈状态、过程寄存器等。通常,当过程故障时,栈状态和过程寄存器信息丢失。内存状态是指被保留的内存部分,包括堆上的被持久引用的对象。特别地,过程状态包括关于对象以及它们的引用的信息。此外,容错机制(例如,过程管理器、操作系统等)维持过程状态的备份拷贝以处理过程的故障状况,诸如由于软件或硬件错误造成的故障。如将在下文更详细示出的,在本申请的实施例中,过程状态的备份拷贝包括具有持久引用的对象。
恢复故障的过程的确切状态通常是不可行的,这是因为将每次内存写入从原始过程传输至该过程状态的备份拷贝以使得此类写入不会因为故障而丢失是昂贵的。此外,考虑到如果该故障由软件缺陷导致则在先前实例故障的精确点重启过程很可能导致重复相同的故障,传输确切状态是不可取的。因此,备份拷贝通常表示过程的较早的状态。在一些实施例中,备份拷贝仅具有与内存堆而非栈关联的状态,并且特别地,仅具有持久引用而不具有暂时引用。
回到图5A,当内存应当被回收时发起流程500。例如,当原始过程自身、过程管理器或监视运行在系统上的过程的任何其他过程检测到由该过程使用的内存量超过阈值并确定应当进行内存回收时,可以发起流程500。在502处,重启正在执行的原始过程。
图5B是图示了用于重启原始过程的过程的实施例的流程图。在该示例中,用于重启原始过程的过程550可以用于过程500的实现502。在552处,当确定内存回收应当进行时,做出终止请求。在各实施例中,原始过程自身或过程管理器请求操作系统终止该原始过程。在554处,原始过程被终止。在一些实施例中,操作系统终止原始过程,并回收分配给该原始过程的所有内存及其他资源。在556处,利用初始内存状态重启该过程。在一些实施例中,诸如过程管理器的过程重启机制被通知该终止或发现该终止,并作为响应而利用诸如该过程的默认内存状态之类的初始内存状态重启该过程(诸如,将过程载入内存并开始执行)。
回到图5A,在504处,从备份拷贝恢复重启过程的状态的至少一部分,其具有与原始过程状态相同的具有持久引用的对象但具有与原始过程状态相比更少的仅具有暂时引用的对象或者完全不具有此类对象。图5C是图示了用于从备份拷贝恢复过程状态的过程的实施例的流程图。过程570可以用于实现504过程500。在572处,针对重启过程而重建来自备份拷贝的由持久引用所引用的对象。在一些实施例中,当重建其内存状态时,重启过程从备份拷贝中拷贝具有持久引用的对象并排除仅具有暂时引用的对象。该效果为回收了与仅具有暂时引用的对象关联的内存量。在574处,重启过程代替原始过程。在一些实施例中,重启过程是原始过程的代替(或新的实例)的该过程或过程管理器配合于系统的剩余部分,根据必要发信号至系统的剩余部分。
图6是图示了基于重启的回收过程中的过程状态的示例的图。连同图6一起解释图5A-5C的流程。如图6中所示,原始过程状态602具有处于堆上且由来自变量栈的暂时引用614所引用的对象604以及处于堆上并由持久引用616所引用的对象616。过程状态608的备份拷贝包括具有持久引用的一个或多个对象而不包括仅具有暂时引用的对象。在该情况下,内存状态的备份拷贝包括对象606而并不包括对象604。因此,当该过程重启时,从备份拷贝608恢复的新重启过程的存储器状态610也包括对象606而不包括对象604。
在一些实施例中,程序员规定当过程重启时什么保留或丢弃。特别地,对那些应当在重启时保留的对象(例如,会话信息、用户数据、事务信息等)进行持久引用,并对那些不需要在重启时保留的对象(例如,历史信息、日志信息等)进行暂时引用。持久引用当它不再需要时从指向对象被移除,因此当重启时它不被保留。
实际上,过程状态通常包括确保顶层对象被引用的一个或多个根持久引用。其他对象被顶层对象引用并且引用又更多对象,从而形成树状对象图。因此,在一些实施例中,通过开始于对对象的根持久引用并将由根持久引用所引用的每个对象传递(例如,拷贝)至重启过程并且然后递归地传递由传递的对象所引用的所有对象以实现传递闭包来将备份过程状态提供至重启过程。
在一些实施例中,通过追踪针对原始过程的堆内存状态的增量更新来维持备份拷贝。图7是图示了针对过程的堆内存状态的增量更新的示例的内存状态图。在该示例中,在原始过程的执行期间,将针对原始过程的堆内存状态702的增量更新流送(例如,异步发送)至备份拷贝的堆内存状态704,因而维持大约为原始过程的内存状态的复制的备份拷贝,并确保该备份拷贝相对于当前过程状态合理地为最新的。例如,当在原始过程的内存状态702上对象O的属性从A变为V时,作为该改变的通知的更新消息被发送(例如,至执行过程自身),以使得相应地在备份拷贝上做出相同的更新。
在一些实施例中,备份拷贝使用类似在图1中所示的引用图进行表示。例如,备份拷贝可以被维持为具有反映原始过程状态的内存状态(堆状态)的引用的对象的内存实例。
该更新还可以包括针对对象的引用的删除,并因此可以导致一个或多个对象相对于根引用被解除引用,但仍存在于备份拷贝中。备份拷贝中的解除引用的对象不被重启过程所重建,这是因为如上文所述的,通过跟随用以定位对象的引用图中的引用的传递闭包而未发现对象。例如,如果仅从原始拷贝702删除对象O的引用,则对象O变成不被引用。关于该删除的消息被发送至备份拷贝704,其也将删除该引用并在备份拷贝中留下对象O为不被引用。当从备份拷贝中恢复状态时,不从备份拷贝中拷贝不被引用对象;因此,与此类对象关联的内存被回收。
在一些实施例中,系统状态在面向状态过程和面向处理过程之间进行划分。前者通常执行相对少的或受限的处理,而后者执行应用的大部分处理逻辑。例如,数据库过程可被视为面向状态过程,并且网络服务器过程可被视为面向处理过程。在一些实施例中,每个面向状态过程执行,同时将它的状态的增量更新流送至从这些增量更新维持该状态的复制内存中拷贝的备份过程。该复制也称为内存状态的备份拷贝。在一些实施例中,用于面向状态过程的回收内存包括使用故障转移(failover)过渡来重启该面向状态过程。
图8是图示了用于重启过程的流程的实施例的流程图。在该示例中,面向状态过程是原始过程。在802处,针对原始过程维持第一(现有的)备份过程。原始过程执行,同时将其过程状态的增量更新流送至第一备份过程,其将原始过程的内存状态的复制内存中拷贝维持为内存状态的第一备份拷贝,并基于更新调整第一备份拷贝。
当确定内存回收应当进行时(例如,当面向状态过程超过阈值内存使用等级时),为了到达回收点,故障转移过渡进行。在804处,创建第二备份过程。第二备份过程是针对将代替原始过程的第一备份过程的备份过程。第二备份过程仅利用现有过程状态中的被引用对象来初始化,其被反映在内存状态的第一备份拷贝中。在一些实施例中,通过跟随来自如早前所述的根持久引用的引用来实现该初始化。因此,任何不被引用对象(例如,在一个或多个更新期间其(一个或多个)持久引用已被删除的对象)不被包括在结果所得的第二备份过程状态中。因此,第二备份过程状态包括比第一备份过程状态更少的不被引用对象。在806处,转换第一备份过程以作为原始的面向状态过程的代替而执行。在一些实施例中,发信号给系统的剩余部分以将第一备份过程视为针对原始过程的代替。在808处,原始过程被终止并且对于回收的下一轮而言第一备份过程变为“原始过程”。
在一些实施例中,在过程800完成后,重复804-808,以使得第三备份过程被创建并且仅利用来自现有内存状态的被引用对象(其被反映在第二备份过程的内存状态中)而发起。第三备份过程作为第二备份过程的备份过程运行。第二备份过程变为代替过程并且第一备份过程被终止。此时,存在于原始面向状态过程中的不具有引用的所有对象都不继续存在于第二备份过程中,第二备份过程在第二次过渡后已经变成代替面向状态过程。
结合图9解释流程800。图9是图示了基于重启的回收过程中的过程状态的示例的数据图。在该示例中,原始过程状态为902。过程状态的第一备份拷贝904被维持作为原始内存状态的复制内存中实例(换句话说,备份拷贝被存储在内存中而不是磁盘上)。第一备份拷贝有具有反映原始过程的内存状态(堆状态)的引用的对象。在该示例中,在过程状态902中,对象910是仅具有暂时引用的栈上的对象。根据针对到达回收点的要求,对象910不反映在第一备份拷贝904上。对象912和914具有持久引用。根据这些要求,对象912和914被反映在第一备份拷贝904上。在执行期间,对912的持久引用被删除并且对象912变为不被引用。该增量更新被反映在第一备份拷贝904上,并且第一备份拷贝上的对象912也变为不被引用。
当重启原始过程时,创建第二备份过程。状态的第二备份拷贝906基于第一备份拷贝904中的被引用的对象而被实例化。第一备份拷贝904由第一备份过程直接使用,其充当接管原始过程的功能的执行过程。此时原始过程被终止。这样,第一备份拷贝904变成针对重启过程的新的主过程状态。第一备份拷贝904使与仅由暂时引用所引用的对象关联的内存被回收。例如,对象910不存在于备份拷贝904上。备份拷贝904还包括已经丢失其持久引用的某些对象(例如,对象912),并且此时不回收与这些对象关联的内存。因为在第二备份拷贝906中不重建诸如912的不被引用对象,所以当到达下一回收点时,与不被引用对象关联的内存变为被回收的。在下一回收点处,创建第三备份过程并且内存状态的第三备份拷贝908仅利用来自第二备份拷贝906的被引用对象而发起。第二备份拷贝906由重启过程直接使用。最新的过程状态不具有仅由暂时引用所引用的对象,并且不具有不被引用对象。换句话说,在两次过渡后实现面向状态过程的完全重启,其中第一过渡利用第一备份过程代替原始过程,然后第二过渡利用第二备份过程代替第一备份过程,以使得不被引用对象或仅由暂时引用所引用的对象不存在于当前的有效过程(即,第二备份过程)中。
在一些实施例中,面向状态过程及其备份过程的管理确保备份过程在比面向状态过程已经运行的更短的时间段内与面向状态过程同步运行。例如,如果原始的面向状态过程已经运行了30秒,则第一备份仅在最近的15秒内运行并与该原始面向状态过程同步。因此,可以期望第一备份拷贝具有比原始更少的不具有引用的对象。假设对象以每秒一个对象的速率变得不被引用,那么原始过程在30秒时间段结束时将具有30个不被引用的对象,但是第一备份拷贝将仅具有在最近15秒之上累积的15个不被引用的对象。继续该示例,如果然后引起过渡以创建新的第二备份并且从原始故障转移至第一备份,则新的有效面向状态过程具有15秒的不被引用的对象的累积,而第二备份不具有不被引用的对象。在该示例中,假设对象以恒定速率变为不被引用,则每次故障转移过渡从该面向状态过程中的状态的立足点有效地回收一半不被引用的对象。进一步地,故障转移过渡的速率可以根据相对于故障转移过渡的成本的不被引用对象的累积的速率来控制。给定生成不被引用对象的特定速率以及累积不被引用对象的期望速率,可以确定故障转移过渡/重启的速率。故障转移过渡的更高速率将导致累积更少的不被引用对象但招致更高的故障转移过渡成本。
在一些实施例中,存在运行在系统中或应用中的多个面向状态过程。这些过程的持久状态共同形成系统或应用的持久状态。该持久状态被视为提交(commit)的或真实的状态。当重启时,面向处理过程从包含并维持其持久状态的面向状态过程恢复其过程内存状态。
在一些实施例中,在更新日志中记录增量更新,这与本领域中公知的重做日志类似。在此类情况下,一旦整个增量更新日志已被完全重放,则对于增量更新记录的重放可能的是使不被引用的对象被重建。然而,执行如上文图8和9中所示的多个故障转移操作可以除去该人工因素。
在一些实施例中,更新日志被实现为有效过程和该过程状态的备份拷贝之间的过程间通信连接。在此类情况下,当接收到日志更新记录时,日志更新记录可以被应用至备份拷贝,从而使得该备份拷贝为更加新的。
在一些实施例中,过程状态的备份拷贝由检查点机制(例如,在应用中使用特殊代码实现的)提供,其周期性地保存过程的当前状态。对于此类情况,在每个检查点处,保存的过程状态仅包括具有持久引用的对象或者仅持久引用的对象在重启过程中重建,这是通过如上文所述的那样开始于根引用并递归地跟随持久引用。
在一些实施例中,基于检查点和增量更新的组合来提供过程备份拷贝。在每个检查点处,对应的过程状态被保存,并且在检查点之间产生增量更新以使过程状态保持是最新的。当过程重启时,根据最近可用且完整的检查点加上自创建检查点以来发生的增量更新来恢复过程状态。在过程重启时重建的不被引用对象数由自最近检查点的时间以来被创建并且然后被删除的不被引用对象数所限制。
在一些实施例中,对堆内存的更新被封装在事务中,其中事务定义了一起提交或都不提交的改变集。在此类情况下,可以仅在事务提交时将更新应用至备份拷贝。因此,当恢复以及回收时,重启过程从最近提交的状态重新开始。
在一些实施例中,重启过程甚至可以在它已完全恢复原始过程的过程状态之前开始处理。例如,取决于处理需要,该过程可以按需加载针对远程对象的代理。代理可以为表示该对象的桩(stub)或壳(shell)但不包括与该对象关联的所有细节,诸如参数值。重启过程可以在不具有原始过程所具有的任何代理的情况下开始处理,从而推迟它们的实例化直到需要。
在一些实施例中,在重启过程期间,新过程和当前过程可以同时运行。尤其是,新过程在终止当前过程前启动。新过程从备份中恢复现有的过程状态;同时,当前过程仍在运行,并继续进行增量更新以及将增量更新按需传送至备份拷贝直到新过程已经从备份中恢复现有的过程状态。此时,备份进一步将它已经从当前过程接收到的任何剩余的更新传送至新过程,当前过程被中止或终止,并且由新过程接管。例如,当新过程开始时,备份具有持久引用的对象A和B。新过程通过拷贝对象A和B来恢复现有的过程状态;在新过程完成A和B的拷贝前,当前过程同时创建新的持久引用对象C。当前过程将增量更新(对象C的创建)传送至备份拷贝。一旦新过程完成拷贝A和B,则当前过程被中止或终止,并且备份拷贝将对象C的创建通知给新过程,新过程也将创建所述对象C。一旦新过程完成拷贝对象C,则新过程接管。在此类情况下,重启可以视为将计算从原始过程迁移至新过程。该方法最小化对应用执行的中断,即,旧过程停止执行和新过程接管之间的时间。
在一些实施例中,在回收点处,当前过程可以重置其内存状态并从备份拷贝重建该状态而不是终止当前过程并启动新过程,从而节约终止该过程并实例化新过程的成本。
在一些实施例中,在回收点之间使用基于代的对象追踪而不是创建过程状态的单独备份拷贝。以与公知的分代无用单元收集技术相似的方式,当前过程创建对象并追踪对象的单独的代,这与图2所示的内容相似。此外,较旧的对象被维持在跨过程重启而保留的单独的内存段中。在一些实施例中,在回收点处并当重启新过程时,用于较旧对象的单独内存段被映射至新过程的地址空间,以使得较旧的对象在不改变的情况下可用于新过程。该映射可以使用本领域技术人员公知的操作系统支持的内存共享功能来实现。针对新过程重建更年轻的(即,在最近的回收周期后创建的)并且保持在与较旧的对象不同的内存区域中的对象,并使用上述技术回收该对象。可选地,在每个回收点处,在幸免于回收的持久引用对象将变得“旧化(age)”并存储在用于较旧对象的保留的代内存段中。该方法是有效的,这是因为较旧的对象趋于以比更年轻的对象更高的速率持久引用。使用该方法,减少了重建较旧对象的成本,从而实现与分代无用单元收集相似的好处。在一些实施例中,上述回收/重启周期是次要回收周期。与分代无用单元收集类似,除了次要回收周期外,可以存在以比一般过程重启更低的频率发生的主要周期,其中使用与上文所述的相同技术回收针对较旧对象的单独内存段。例如,较旧对象的备份拷贝可以用于重建持久引用对象,并且可以释放针对较旧对象的单独内存段。相似的方法可以用于保留某些资源(诸如网络连接),而不是释放这些资源并当过程重启时重新获取它们。
在一些实施例中,某些引用可以进一步区分为弱引用或强引用。如本文所使用的,弱引用是不防止对象被损毁的引用,并可以由操作系统或应用设置为空。注意,从程序员的观点来看,弱引用不同于暂时引用。弱引用不防止对象被损毁,但是当对象被损毁时被设置为空。相反地,暂时引用确实防止对象被损毁。例如,子对象可以具有对其父对象的弱引用,以使得如果父对象不再由除了子对象之外的任何其他对象引用,则可以损毁父和子对象两者。在此类情况下,当重启时,针对其仅存在弱引用的对象不被重建并且针对该对象的任何弱引用被设置为空。
在另一方面,操作系统检查内存使用率,并且当过程到达配置的内存限制时回收被触发。许多操作系统提供规定对给定过程可以使用的内存量的限制的能力。当过程到达该限制时,由该过程的任何内存分配请求将被拒绝,或者操作系统可以简单地终止该过程。在任何情况下,回收作为重启的一部分而发生,这如上文所述的那样。
在一些实施例中,基于应用特定的负载测量来动态调整内存限制。例如,如果过程正在处理N个用户,则应用可以被编程以估计针对处理N个用户严格所需的内存量,例如K*N兆字节(其中K是每用户需要的内存量),并将内存限制调整为新的值,诸如2K*N兆字节。因此,当该过程使用处理其提供的负载严格所需的内存的两倍时,使该过程重启。在该示例中,该限制与用户数成比例。可以使用其他限制函数。该内存开销相当于针对许多无用单元收集系统报告的但是在不具有无用单元收集开销的情况下实现的开销。
在容错系统中,上文所述的回收技术不仅使用现有的机制(即过程重启),而且还确保该机制频繁运用,从而改善当故障发生时该机制工作的可能性。相反地,它消除了具有需要额外测试并且可能成为单独故障源的单独内存回收机制。该回收技术还避免了正在进行的内存残片。内存被有效压缩为重启的部分。该回收技术可以用于当由于主机限制而到达内存限制时将过程移动至新的主机。此外,在终止原始过程前创建新重启过程的情况下,对应用执行的干扰被最小化。
基于损毁列表的回收
如上文所讨论,在一些实施例中,由于为针对持久对象的持久引用计数维持有记录,所以持久引用被说成被记录。例如,可以存在指示与该对象关联的持久引用数的引用计数字段。暂时引用不记录,原因在于它不维持或影响引用计数。进一步地,在一些实施例中,存在回收数据结构,诸如作为(延迟)损毁的候选者的对象的列表。该列表被称为损毁列表。
图10A是图示了用于创建并使用用于回收的损毁列表的过程的实施例的流程图。当从对象移除持久引用时,发起过程1000。在1002处,确定对象的持久引用计数已到达0。因此,在1004处,对该对象的引用(例如,指针)被添加至回收数据结构(例如,损毁列表)。可以针对许多对象重复过程1000。随后,当周期性地到达回收点时或响应于过程到达内存大小阈值,任务线程在该损毁列表之上迭代。
图10B是图示了损毁列表迭代器过程的实施例的流程图。在1502处,确定对象是否具有引用计数0。损毁列表上的对象可以具有非零引用计数,如果其引用计数在对象被添加至损毁列表后递增的话。如果引用计数为非零,则在1504处,该对象从损毁列表中删除;否则,执行对象特定的处理。特别地,在1506处调用对象的损毁器。在1508处,对象的损毁器解除引用被该对象所引用的其他对象,并将具有0引用计数的任何不被引用对象添加至损毁列表。在1510处,释放该对象的内存。如果下一对象可用,则由迭代器针对损毁列表中的下一对象重复过程1500。
在一些实施例中,通过要求每个线程周期性产生(其中在其栈上不具有暂时引用状态)并且移除不被引用对象来到达回收点。在多线程过程中,可以通过实现栅障(barrier)同步技术到达回收点,所述栅障同步技术使得所有线程在栅障处等待直到所有线程均准备好继续进行。栅障同步技术对于本领域技术人员是公知的。为了回收内存,在栅障处,线程移除不被引用的对象。在其中处理被划分为其中在每个回合处线程必须一起继续进行的回合(称为基于回合的计算)的应用中,此类栅障将已经由应用所需要。因此,当存在足够的未回收的内存来证明执行该回收是合理的时,回合障碍还可以用作回收点的目的。
在一些实施例中,可以允许线程在不处于内存堆中的已知位置中保留某一数量的暂时引用。该回收处理然后必须觉知到这些引用并在回收期间将这些引用视为对该对象的有效持久的引用。换句话说,不回收与由已知位置中的暂时引用所引用的这些对象关联的内存。
在上文的示例中,在回收点处,不存在仅由暂时引用所引用的对象。在一些实施例中,在回收点处,只要能够容易地发现对这些对象的暂时引用,就允许仅由暂时引用所引用的对象存在;例如,如果暂时引用可以在不必针对它们进行搜索的情况下被直接访问的话,这是因为暂时引用仅位于规定位置处。换句话说,当损毁线程/损毁列表迭代器时常地运行以处理损毁列表上的对象时,它能够定位规定位置处的任何暂时引用并特别对待这些暂时引用。尤其是,当对象的持久引用计数为0时,检查规定位置处的对象的暂时引用的存在。仅在规定位置处未发现存在暂时引用的情况下,损毁该对象并且释放其内存。
在一些实施例中,可以使用基于重启回收和损毁列表回收两者。优选地,基于重启的回收响应于内存残片、循环引用以及损毁列表上未列出的对象而不常被调用,而基于损毁列表的回收被用于减少重启之间的内存消耗,或者相反地在不消耗过多的内存量的情况下允许重启之间的更长时间段。
针对延迟损毁的优化
延迟损毁避免需要记录针对对象的暂时引用。然而,它确实意味着内存堆中的对象可以比使用立即损毁的情况更长地继续消耗资源。为了减少该成本,若干改良是可行的。
具有延迟损毁的立即终止
具有响应于对象状态自身的改变而回收的一些资源是可行的。例如,执行计算的对象可以在该对象中具有一些被设置为指示其操作模式的属性字段。客户(例如,对象的使用者)然后可以将该属性设置为“终止”以指示它应当停止计算并释放资源。与该字段关联的过程可以被触发并释放由该对象正在使用的计算资源,而不损毁该对象。相似地,可以响应于相同或相似的对象修改而释放锁定、打开的文件、网络连接以及其他资源。
在一些实施例中,可以通过如上文所述的那样将该属性设置为“终止”来触发从父收集或其他收集中的删除,在该对象上仅需要的用以触发该关闭和回收处理的应用动作是将关联的属性设置为“终止”。该方法被称为基于属性的终止。
基于属性的终止方法允许通过写入该属性而触发的对象活动和某些资源消耗的立即终止。相反地,如果这些动作仅在损毁时执行,则即使当对象不具有引用时立即发起损毁,该动作也会被保留对该“终止”对象的引用的一些对象延迟得太久。程序员难以确保在相对短的时间量内移除所有引用。该方法可以被提供为指示对象的操作状态的通用属性的部分,状态值包括例如“初始化”、“运行”和“待机”,以及“终止”。因此,当用于指示立即资源释放时它不会强加任何额外的消耗,如本文的焦点,这是因为在任何情况下均需要对基于属性的处理的支持。进而,该方法允许其他对象对该属性做出与其他属性相同的反应以移除它们对所述对象的引用或其他相关处理,从而迅速识别何时对象不再具有功能或不被需要。使用该方法,实际的对象损毁具有最少的应用语义或不具有应用语义,这是因为在该损毁处发生的仅有的真实处理是内存回收和解除引用。
在一些实施例中,作为基于属性的终止的代替,可以从一些收集中删除对象,从而导致识别该对象改变并释放该对象然后不再需要的任何资源的过程被触发。此类删除通常需要对对象自身的相似修改,这是因为对象包含当删除时清除的对收集的后指针。可以在该修改时触发局部对象处理,这与基于属性的损毁相似。
栈优化的数据类型表示
在一些实施例中,通常被存储在栈上的大的或可变大小的数据类型还可以常规地被设计为针对该可变大小的数据分配堆内存,可以设计为最小化该堆分配的频率。例如,图11A是图示了一般字符串实现的数据结构图。如所示的,实现定义了包含针对在堆上被分配的可变大小的字符串缓冲区的指针的顶级字符串类型,从而在字符串中存储实际的字节。该设计适应可变大小的字符串而且意味着字符串可以在不拷贝字符串内容的情况下通过值高效传递。然而,其确实意味着创建的每个临时字符串分配直到下一回收点都被浪费的堆内存。
图11B是图示了针对字符串的不同实现的数据结构图。如所示的,顶级类型包括K字节的固定大小的行内字符串缓冲区(其在栈上),其中如果字符串数据在长度方面小于或等于K字节,则该行内缓冲区存储字符串字节,并且不需要堆分配。该顶级类型还包括针对位于堆上的用于存储大于K字节的字符串数据的缓冲区的缓冲区指针。例如,短于K字节的对象1102的字符串数据被存储在栈上的行内字符串缓冲区中。相反,大于K字节的对象1104的字符串数据被存储在堆上的规则缓冲区中。在一些实施例中,测量指示80%-90%的字符串在长度方面小于32字节。因此,通过将K设置为32字节,80%-90%的临时字符串不使用堆内存并因此在它们不再处于范围内的时间和下一回收点之间不浪费内存。通常在栈上实例化因此其在一般情况下不使用堆的扩展类型的该方法广泛地适用。另一示例是在标准实现中具有可变大小的位图,即使在实际中,位图的大小也相对小。基于栈的、固定大小的位图类型可以被定义在更有效的替换实现中。
作为进一步的优化,可以存在相同数据类型的单独的暂时和持久表示,其中前者被优化以避免堆分配而后者被优化以用于空间效率和内存堆分配。例如,在一些实施例中,编程环境(例如,编程语言、编译器等)支持在栈上分配的固定大小的暂时字符串,以及在堆上分配的持久字符串。
在一些实施例中,执行逃逸分析以将堆上的分配转换为栈上的分配。逃逸分析是用于确定指针动态范围和指针是处于栈上还是处于堆上的公知技术。使用逃逸分析可以进一步减少回收点之间的内存的浪费。例如,在堆上分配的字符串可以被转换为在栈上分配的字符串,如果它们满足大小要求的话。
针对内部对象的专用分配器
在一些实施例中,作为另一种优化,可以以某一频率分配和删除某些内部对象。例如,文件服务器中的打开文件描述符当每个文件打开时被分配并且当每个文件关闭时被解除分配,并且可以表示内存分配/解除分配行为的有效部分。这些对象通常可以被做成固定大小。对于这些对象,可以使用有效保持类型特定的释放列表的专用分配器,因此对象即使当它被释放时也会留下规定类型;它仍保持在内存中,不过为非活动的。
利用该优化,此类对象被放回在类型特定的释放列表上而不是释放回到由堆提供的一般内存库。因此,由于该对象未被回收,所以对该对象的暂时引用不需要被特别处理。此外,在许多情况下,这些辅助对象对于可以知晓所有可能的引用的模块而言是内部的。因此,这些对象可以被分配或激活以及释放,而不贡献在下一回收点之前不回收的内存。
在一些实施例中,字符串实现可以使用针对在堆中分配的字符串缓冲区的专用分配器,从而确保它们被有效回收,处理比行内字符串缓冲区更大的字符串。
在一些实施例中,仅在给定函数内使用的非共享但堆分配的内存可以利用C++auto_ptr或自动释放内存的相似机制来处理,并且不需要引用计数(但确实要求存在对已分配内存的单个引用)。
调度回收
在一些实施例中,使用损毁列表回收,线程可以被调度以随时间执行回收以最小化对应用的响应时间影响,或者在该过程以其他方式空闲时执行回收。
在一些实施例中,过程维持内存储备库。当它耗尽它的正常内存分配时,它可以开始使用内存储备库以允许在调度它执行回收的点的方面的更大的灵活性。例如,当切换至储备库时,过程可以设置指示该状态的旗标。随后,如果应用在该旗标被设置时到达静止状态,则它执行回收。换句话说,一旦到达储备库,则该过程可以在它一准备好这样做时就执行回收。
在一些实施例中,该储备库被实现为低于绝对限制的额外内存分配阈值,从而允许该过程当它能够继续进行分配时做出反应,直到针对回收的优选时间。
在一些实施例中,回收调度器指示每个过程何时可以执行回收,因此避免同时发生过多数量的回收并因此使应用性能降级。例如,过程可以请求当它到达诸如开始使用其储备库的“软”阈值时被调度,并且然后当调度响应于这样做的指示时进行回收。
使用上文描述的这些技术,可以当仍然提供对对象“终止”的快速响应和资源的快速回收以及还最小化在回收点之间浪费的内存量(这是因为它可以潜在地被回收但还未被回收)并最小化对应用性能的干扰时,使用延迟损毁。
虽然出于清晰理解的目的已经相当详细地描述了前述实施例,但是本发明并不限于提供的细节。存在实现本发明的许多替换方式。公开的实施例为说明性的并非限制性的。
Claims (24)
1.一种方法,包括:
执行具有多个对象的过程,所述对象可经由多个引用而访问,所述多个引用的至少一些为暂时引用,所述多个引用的至少一些为持久引用;
到达回收点,在所述回收点处过程状态不具有暂时引用或仅在已知位置处具有暂时引用;以及
在回收点处损毁不具有持久引用并且不具有暂时引用的对象。
2.权利要求1的方法,其中到达回收点包括:
重启所述过程;以及
从包括具有持久引用的对象的备份拷贝中恢复所述过程的状态的至少部分。
3.权利要求2的方法,其中所述备份拷贝不具有暂时引用。
4.权利要求2的方法,其中通过从所述过程接收增量更新来维持所述备份拷贝,增量更新包括关于针对所述过程的内存状态的更新的信息。
5.权利要求2的方法,其中所述备份拷贝中的具有持久引用的对象可通过跟随来自一个或多个指定的根引用的引用而到达。
6.权利要求2的方法,其中使用至少检查点和增量日志来维持所述备份拷贝。
7.权利要求2的方法,其中所述备份拷贝是所述过程的内存状态的内存中复制。
8.权利要求2的方法,其中:
所述过程是原始过程;
所述备份拷贝是原始过程的内存状态的内存中复制;以及
重启所述过程包括:
维持针对所述原始过程的第一备份过程,包括从原始过程接收增量更新;
创建第二备份过程并仅利用来自所述备份拷贝的被引用对象来初始化所述第二备份过程;
转换所述第一备份过程以作为针对所述原始过程的代替来执行;以及
终止所述原始过程。
9.权利要求8的方法,其中重启所述过程进一步包括:
创建第三备份过程并仅利用来自所述第二备份过程的被引用对象来初始化所述第三备份过程;
转换所述第二备份过程以作为针对所述第一备份过程的代替来执行;以及
终止所述第一备份过程。
10.权利要求8的方法,其中所述增量更新被记录在更新日志中。
11.权利要求2的方法,其中基于在其处所述过程状态被保存的检查点处的过程状态和增量更新集来提供所述备份拷贝。
12.权利要求1的方法,其中:
所述多个对象存储在多个内存段中,每个内存段对应于与对应的对象关联的不同代;以及
到达所述回收点包括将与较旧代的对象对应的内存段映射到重启过程的地址空间。
13.权利要求1的方法,进一步包括:
在所述执行期间:
确定不存在针对对象的持久引用;以及
将针对所述对象的引用添加至回收数据结构;以及
在所述回收点处,损毁所述回收数据结构中的不具有持久引用并且不具有暂时引用的所有对象。
14.权利要求1的方法,其中在所述回收点处执行对象特定的处理。
15.权利要求1的方法,其中如果在回收点之后要维持引用,则所述引用仅被记录在备份拷贝中。
16.权利要求1的方法,其中持久引用被记录并且暂时引用不被记录。
17.权利要求1的方法,其中在栅障处到达所述回收点,所述栅障使多个线程在所述栅障处等待,并且所述方法进一步包括,在所述栅障处,移除不被引用的对象。
18.权利要求1的方法,其中响应于属性改变而执行终止所述对象的处理。
19.权利要求1的方法,其中使用基于栈的、固定大小的数据类型来定义所述对象的至少一些。
20.权利要求1的方法,其中所述对象的至少一些具有对象类型,所述对象类型具有暂时表示和持久表示两者。
21.权利要求1的方法,进一步包括执行逃逸分析,并基于所述逃逸分析的结果,将在堆上分配的对象转换为在栈上分配的对象。
22.权利要求1的方法,其中响应于内存储备库正被所述过程使用而触发到达所述回收点。
23.一种系统,包括:
存储过程的多个对象的一个或多个存储器;以及
耦合至所述一个或多个存储器的一个或多个处理器,用以:
执行具有所述多个对象的所述过程,所述对象可经由多个引用而访问,所述多个引用的至少一些为暂时引用,所述多个引用的至少一些为持久引用;
到达回收点,在所述回收点处过程状态不具有暂时引用或仅在已知位置处具有暂时引用;以及
在回收点处损毁不具有持久引用并且不具有暂时引用的对象。
24.一种计算机程序产品,所述计算机程序产品被体现在有形计算机可读存储介质中并包括计算机指令,所述计算机指令用于:
执行具有多个对象的过程,所述对象可经由多个引用而访问,所述多个引用的至少一些为暂时引用,所述多个引用的至少一些为持久引用;
到达回收点,在所述回收点处过程状态不具有暂时引用或仅在已知位置处具有暂时引用;以及
在回收点处损毁不具有持久引用并且不具有暂时引用的对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010533190.9A CN111708714B (zh) | 2014-03-12 | 2015-03-11 | 用于有效资源回收的延迟损毁 |
Applications Claiming Priority (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201461951993P | 2014-03-12 | 2014-03-12 | |
US61/951993 | 2014-03-12 | ||
US201461955096P | 2014-03-18 | 2014-03-18 | |
US61/955096 | 2014-03-18 | ||
US14/640868 | 2015-03-06 | ||
US14/640,868 US10437720B2 (en) | 2014-03-12 | 2015-03-06 | Deferred destruction for efficient resource reclamation |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010533190.9A Division CN111708714B (zh) | 2014-03-12 | 2015-03-11 | 用于有效资源回收的延迟损毁 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105320567A true CN105320567A (zh) | 2016-02-10 |
CN105320567B CN105320567B (zh) | 2020-06-26 |
Family
ID=54069035
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010533190.9A Active CN111708714B (zh) | 2014-03-12 | 2015-03-11 | 用于有效资源回收的延迟损毁 |
CN201510212579.2A Active CN105320567B (zh) | 2014-03-12 | 2015-03-11 | 用于有效资源回收的延迟损毁 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010533190.9A Active CN111708714B (zh) | 2014-03-12 | 2015-03-11 | 用于有效资源回收的延迟损毁 |
Country Status (2)
Country | Link |
---|---|
US (2) | US10437720B2 (zh) |
CN (2) | CN111708714B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108228340A (zh) * | 2017-08-07 | 2018-06-29 | 珠海市魅族科技有限公司 | 终端控制方法及装置、终端设备及计算机可读存储介质 |
CN110945496A (zh) * | 2017-07-27 | 2020-03-31 | 思科技术公司 | 用于状态对象数据存储区的系统和方法 |
CN113900743A (zh) * | 2021-09-24 | 2022-01-07 | 阿里云计算有限公司 | 一种Java对象访问的方法和装置 |
CN114896178A (zh) * | 2022-05-20 | 2022-08-12 | 广东天太机器人有限公司 | 一种内存清空的方法及装置、设备和存储介质 |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11030262B2 (en) * | 2015-08-25 | 2021-06-08 | Verizon Media Inc. | Recyclable private memory heaps for dynamic search indexes |
CN105808447B (zh) * | 2016-03-29 | 2019-01-29 | 海信集团有限公司 | 一种终端设备的内存回收方法和装置 |
US10416918B2 (en) | 2016-06-28 | 2019-09-17 | Vmware, Inc. | Service state management in a decentralized control plane of a computing system |
US10037166B2 (en) | 2016-08-03 | 2018-07-31 | Ge Aviation Systems Llc | Tracking memory allocation |
US10558564B2 (en) | 2017-09-28 | 2020-02-11 | Hewlett Packard Enterprise Development Lp | Pointers in a memory managed system |
US10983840B2 (en) * | 2018-06-21 | 2021-04-20 | International Business Machines Corporation | Consolidating read-copy update types having different definitions of a quiescent state |
CN117093408B (zh) * | 2023-10-20 | 2024-01-23 | 恒生电子股份有限公司 | 数据处理方法以及装置 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0642686A1 (en) * | 1991-11-20 | 1995-03-15 | Parcplace Systems, Inc. | Postmortem finalization |
US6381738B1 (en) * | 1999-07-16 | 2002-04-30 | International Business Machines Corporation | Method for optimizing creation and destruction of objects in computer programs |
US20030221073A1 (en) * | 2002-05-24 | 2003-11-27 | Saltz Michael K. | Memory management system supporting deletion of transient objects |
US20040168030A1 (en) * | 2000-06-02 | 2004-08-26 | Sun Microsystems, Inc. | Caching mechanism for a virtual heap |
CN101122884A (zh) * | 2006-08-07 | 2008-02-13 | 国际商业机器公司 | 增量压缩堆时用于更新引用的系统和方法 |
CN101169739A (zh) * | 2006-10-27 | 2008-04-30 | 三星电子株式会社 | 管理内存的方法和设备 |
CN101727355A (zh) * | 2008-10-31 | 2010-06-09 | 国际商业机器公司 | 用于内存访问事件的处理方法和系统 |
US20110087634A1 (en) * | 2007-08-24 | 2011-04-14 | International Business Machines Corporation | Converting backup copies of objects created using a first backup program to backup copies created using a second backup program |
US20120246204A1 (en) * | 2011-03-23 | 2012-09-27 | International Business Machines Corporation | Handling Persistent/Long-Lived Objects To Reduce Garbage Collection Pause Times |
CN102999328A (zh) * | 2011-09-09 | 2013-03-27 | 微软公司 | 在循环图中管理对象生命期 |
US20130339643A1 (en) * | 2012-06-18 | 2013-12-19 | Actifio, Inc. | System and method for providing intra-process communication for an application programming interface |
US20140040327A1 (en) * | 2012-07-31 | 2014-02-06 | International Business Machines Corporation | Garbage collection of an object |
Family Cites Families (41)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4695949A (en) * | 1984-07-19 | 1987-09-22 | Texas Instruments Incorporated | Method for efficient support for reference counting |
US4853842A (en) * | 1985-09-11 | 1989-08-01 | Texas Instruments Incorporated | Computer memory system having persistent objects |
US5355469A (en) * | 1990-07-30 | 1994-10-11 | Delphi Data, A Division Of Sparks Industries, Inc. | Method for detecting program errors |
US5485613A (en) * | 1991-08-27 | 1996-01-16 | At&T Corp. | Method for automatic memory reclamation for object-oriented systems with real-time constraints |
US5398334A (en) * | 1992-04-06 | 1995-03-14 | General Electric Company | System for automatic garbage collection using strong and weak encapsulated pointers |
US5873097A (en) * | 1993-05-12 | 1999-02-16 | Apple Computer, Inc. | Update mechanism for computer storage container manager |
US5765174A (en) * | 1995-10-06 | 1998-06-09 | Sun Microsystems, Inc. | System amd method for distributed object resource management |
US5721918A (en) * | 1996-02-06 | 1998-02-24 | Telefonaktiebolaget Lm Ericsson | Method and system for fast recovery of a primary store database using selective recovery by data type |
US6161219A (en) * | 1997-07-03 | 2000-12-12 | The University Of Iowa Research Foundation | System and method for providing checkpointing with precompile directives and supporting software to produce checkpoints, independent of environment constraints |
GB9717715D0 (en) * | 1997-08-22 | 1997-10-29 | Philips Electronics Nv | Data processor with localised memory reclamation |
US6473773B1 (en) * | 1997-12-24 | 2002-10-29 | International Business Machines Corporation | Memory management in a partially garbage-collected programming system |
US6363403B1 (en) * | 1999-06-30 | 2002-03-26 | Lucent Technologies Inc. | Garbage collection in object oriented databases using transactional cyclic reference counting |
US6343296B1 (en) * | 1999-09-03 | 2002-01-29 | Lucent Technologies Inc. | On-line reorganization in object-oriented databases |
US7263700B1 (en) * | 2000-11-06 | 2007-08-28 | International Business Machines Corporation | Serially, reusable virtual machine |
US6718438B2 (en) * | 2000-12-13 | 2004-04-06 | Sun Microsystems, Inc. | Using feedback to determine the size of an object cache |
US6598141B1 (en) * | 2001-03-08 | 2003-07-22 | Microsoft Corporation | Manipulating interior pointers on a stack during garbage collection |
GB0107921D0 (en) * | 2001-03-30 | 2001-05-23 | Ibm | Computer system with multiple heaps and heap reset facility |
CN1306415C (zh) * | 2002-03-20 | 2007-03-21 | 捷讯研究有限公司 | 移动设备上的安全无用信息收集系统和方法 |
EP1387273B1 (en) * | 2002-07-31 | 2010-07-21 | Texas Instruments Incorporated | Conditional garbage collection based on monitoring to improve real time performance |
US7313619B2 (en) * | 2003-03-21 | 2007-12-25 | Intel Corporation | System and method for managing distributed objects as a single representation |
US7404182B1 (en) * | 2003-10-03 | 2008-07-22 | Sun Microsystems, Inc. | Deferring and combining write barriers for a garbage-collected heap |
US8255435B2 (en) * | 2004-10-07 | 2012-08-28 | International Business Machines Corporation | Detecting memory management anti-patterns |
US7730016B2 (en) * | 2005-01-31 | 2010-06-01 | Oracle International Corporation | Identification of false ambiguous roots in a stack conservative garbage collector |
CN101046755B (zh) * | 2006-03-28 | 2011-06-15 | 郭明南 | 一种计算机自动内存管理的系统及方法 |
US7603392B2 (en) * | 2006-06-05 | 2009-10-13 | International Business Machines Corporation | System, method and computer program product for storing transient state information |
US20090307669A1 (en) * | 2008-06-06 | 2009-12-10 | Garst Jr Gerald Blaine | Memory management for closures |
US8032568B2 (en) * | 2008-06-30 | 2011-10-04 | International Business Machines Corporation | Method for performing memory leak analysis inside a virtual machine |
US8301671B1 (en) * | 2009-01-08 | 2012-10-30 | Avaya Inc. | Method and apparatus providing removal of replicated objects based on garbage collection |
US8161084B2 (en) * | 2009-02-20 | 2012-04-17 | Oracle America, Inc. | Memory management of soft references |
US8504878B2 (en) * | 2010-05-04 | 2013-08-06 | Oracle International Corporation | Statistical analysis of heap dynamics for memory leak investigations |
US8782644B2 (en) * | 2011-02-15 | 2014-07-15 | Oracle International Corporation | Preventing unsafe sharing through confinement of mutable captured variables |
US8423589B2 (en) * | 2011-03-14 | 2013-04-16 | International Business Machines Corporation | Copy collector with efficient abort-on-copy transition to mark collector |
US9311229B2 (en) * | 2011-03-29 | 2016-04-12 | Blackberry Limited | System and method for managing flash memory |
US9430677B2 (en) * | 2012-07-10 | 2016-08-30 | Gm Globla Technology Operations Llc | Memory management systems and methods for embedded systems |
CN104321766A (zh) * | 2012-12-31 | 2015-01-28 | 华为技术有限公司 | 数据的处理方法和装置 |
US9009203B2 (en) * | 2013-02-19 | 2015-04-14 | Sap Se | Lock-free, scalable read access to shared data structures using garbage collection |
US9507713B1 (en) * | 2014-09-22 | 2016-11-29 | Google Inc. | Memory object pretenuring |
US10127260B2 (en) * | 2014-11-25 | 2018-11-13 | Sap Se | In-memory database system providing lockless read and write operations for OLAP and OLTP transactions |
US9965504B2 (en) * | 2014-11-25 | 2018-05-08 | Sap Se | Transient and persistent representation of a unified table metadata graph |
US10552402B2 (en) * | 2014-11-25 | 2020-02-04 | Amarnadh Sai Eluri | Database lockless index for accessing multi-version concurrency control data |
WO2016111702A1 (en) * | 2015-01-09 | 2016-07-14 | Hewlett Packard Enterprise Development Lp | Persistent memory garbage collection |
-
2015
- 2015-03-06 US US14/640,868 patent/US10437720B2/en active Active
- 2015-03-11 CN CN202010533190.9A patent/CN111708714B/zh active Active
- 2015-03-11 CN CN201510212579.2A patent/CN105320567B/zh active Active
-
2019
- 2019-07-11 US US16/509,259 patent/US11232026B2/en active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0642686A1 (en) * | 1991-11-20 | 1995-03-15 | Parcplace Systems, Inc. | Postmortem finalization |
US6381738B1 (en) * | 1999-07-16 | 2002-04-30 | International Business Machines Corporation | Method for optimizing creation and destruction of objects in computer programs |
US20040168030A1 (en) * | 2000-06-02 | 2004-08-26 | Sun Microsystems, Inc. | Caching mechanism for a virtual heap |
US20030221073A1 (en) * | 2002-05-24 | 2003-11-27 | Saltz Michael K. | Memory management system supporting deletion of transient objects |
CN101122884A (zh) * | 2006-08-07 | 2008-02-13 | 国际商业机器公司 | 增量压缩堆时用于更新引用的系统和方法 |
CN101169739A (zh) * | 2006-10-27 | 2008-04-30 | 三星电子株式会社 | 管理内存的方法和设备 |
US20110087634A1 (en) * | 2007-08-24 | 2011-04-14 | International Business Machines Corporation | Converting backup copies of objects created using a first backup program to backup copies created using a second backup program |
CN101727355A (zh) * | 2008-10-31 | 2010-06-09 | 国际商业机器公司 | 用于内存访问事件的处理方法和系统 |
US20120246204A1 (en) * | 2011-03-23 | 2012-09-27 | International Business Machines Corporation | Handling Persistent/Long-Lived Objects To Reduce Garbage Collection Pause Times |
CN102999328A (zh) * | 2011-09-09 | 2013-03-27 | 微软公司 | 在循环图中管理对象生命期 |
US20130339643A1 (en) * | 2012-06-18 | 2013-12-19 | Actifio, Inc. | System and method for providing intra-process communication for an application programming interface |
US20140040327A1 (en) * | 2012-07-31 | 2014-02-06 | International Business Machines Corporation | Garbage collection of an object |
Non-Patent Citations (1)
Title |
---|
周志明: "《深入理解Java虚拟机 JVM高级特性与最佳实践》", 30 June 2013 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110945496A (zh) * | 2017-07-27 | 2020-03-31 | 思科技术公司 | 用于状态对象数据存储区的系统和方法 |
CN108228340A (zh) * | 2017-08-07 | 2018-06-29 | 珠海市魅族科技有限公司 | 终端控制方法及装置、终端设备及计算机可读存储介质 |
CN108228340B (zh) * | 2017-08-07 | 2021-02-19 | 珠海市魅族科技有限公司 | 终端控制方法及装置、终端设备及计算机可读存储介质 |
CN113900743A (zh) * | 2021-09-24 | 2022-01-07 | 阿里云计算有限公司 | 一种Java对象访问的方法和装置 |
CN114896178A (zh) * | 2022-05-20 | 2022-08-12 | 广东天太机器人有限公司 | 一种内存清空的方法及装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US20150261670A1 (en) | 2015-09-17 |
CN111708714A (zh) | 2020-09-25 |
US20200104255A1 (en) | 2020-04-02 |
US11232026B2 (en) | 2022-01-25 |
US10437720B2 (en) | 2019-10-08 |
CN105320567B (zh) | 2020-06-26 |
CN111708714B (zh) | 2024-04-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105320567A (zh) | 用于有效资源回收的延迟损毁 | |
US7886294B2 (en) | Virtual machine monitoring | |
US8301671B1 (en) | Method and apparatus providing removal of replicated objects based on garbage collection | |
US9021303B1 (en) | Multi-threaded in-memory processing of a transaction log for concurrent access to data during log replay | |
US7310718B1 (en) | Method for enabling comprehensive profiling of garbage-collected memory systems | |
US7552153B2 (en) | Virtual machine monitoring using shared memory | |
US10275164B2 (en) | Enforcing persistency for battery-backed mobile devices | |
US8738673B2 (en) | Index partition maintenance over monotonically addressed document sequences | |
US6493730B1 (en) | Efficient object faulting with generational garbage collection | |
US20130339569A1 (en) | Storage System and Method for Operating Thereof | |
JP2016524250A (ja) | 複数のアクセスメソッドのためのラッチフリーのログ構造化ストレージ | |
US20070067359A1 (en) | Centralized system for versioned data synchronization | |
US20200310963A1 (en) | Real-time replicating garbage collection | |
CN110362301B (zh) | 一种终端应用行为反射的处理方法 | |
US9251149B2 (en) | Data set size tracking and management | |
US20060161598A1 (en) | Method and apparatus for data versioning and recovery using delta content save and restore management | |
US10915403B2 (en) | Versioned records management using restart era | |
US10761936B2 (en) | Versioned records management using restart era | |
Veiga et al. | Enhancing in-memory efficiency for MapReduce-based data processing | |
WO2020248512A1 (zh) | 一种构造终端应用行为的运行时模型的方法 | |
CN105659214A (zh) | 数据单元集合的检查点设置 | |
US8621171B2 (en) | Compaction planning | |
CN111435302A (zh) | 一种应用程序的处理方法及装置 | |
US20240020167A1 (en) | Key-value storage engine for range scan sorted queries | |
US11720550B2 (en) | Transaction log validation in a database transaction log service |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |