CN107257959A - 托管代码中的垃圾收集控制 - Google Patents

托管代码中的垃圾收集控制 Download PDF

Info

Publication number
CN107257959A
CN107257959A CN201680010066.6A CN201680010066A CN107257959A CN 107257959 A CN107257959 A CN 107257959A CN 201680010066 A CN201680010066 A CN 201680010066A CN 107257959 A CN107257959 A CN 107257959A
Authority
CN
China
Prior art keywords
heap
memory
refuse collection
submitted
computer
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
Application number
CN201680010066.6A
Other languages
English (en)
Other versions
CN107257959B (zh
Inventor
张毛妮
P·H·杜思德
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN107257959A publication Critical patent/CN107257959A/zh
Application granted granted Critical
Publication of CN107257959B publication Critical patent/CN107257959B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0261Garbage collection, i.e. reclamation of unreferenced memory using reference counting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/70Details relating to dynamic memory management
    • G06F2212/702Conservative garbage collection

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)

Abstract

控制垃圾收集操作。该方法包括建立垃圾收集以收集托管代码环境中不再使用的对象。该方法还包括接收指定期望的量的托管代码输入,在期望的量的范围内期望垃圾收集不被执行。该方法还包括执行用于计算操作以确定期望的量很可能能够被满足。该方法还包括在量内运行存储器操作而不运行初始化的垃圾收集。

Description

托管代码中的垃圾收集控制
背景技术
计算机和计算系统几乎已经影响了现代生活的各个方面。计算机一般在工作、休闲、医疗、交通、娱乐、家庭管理等中被涉及到。
一些计算机程序使用所谓的托管代码来编写。托管代码是需要公共语言运行时(CLR)虚拟机的管理并且仅在公共语言运行时(CLR)虚拟机的管理下才执行的计算机程序源代码。例如,托管代码可以在能够从华盛顿州雷德蒙德微软公司获得的.NET Framework下执行。
托管代码通常具有各种工具和管理特征以帮助开发应用。特别地,CLR将处理许多代码管理功能,以防止诸如变量冲突或存储器冲突等冲突。通过使用托管代码并在托管执行环境中编译,开发人员可以避免导致安全漏洞和不稳定的应用的许多典型的编程错误。此外,许多非生产性编程任务(诸如类型安全检查、存储器管理、和不需要的对象的破坏)被自动处理。因此,开发人员可以专注于应用的业务逻辑,并且使用较少的代码行来编写它们。
在托管代码环境中,被称为垃圾收集的过程是可以用于破坏不需要的对象的一种形式的自动存储器管理。垃圾收集器(GC)尝试回收由不再被任何程序使用的对象所占用的存储器。在垃圾收集过程中,由于不再使用的对象被丢弃,并且包含这些对象的存储器被回收以用于其他对象,因此过程线程将因为垃圾收集的全部或部分而被暂停。
然而,某些性能敏感的应用可能希望在没有来自GC的干扰的情况下运行。例如,一些用户已经表示他们不愿意他们的用户线程被暂停超过1ms。例如,在市场交易行业,即使很短的中断也可以使得交易无法进行,从而导致损失。然而,不幸的是,1ms可能不足以在可能是若干GB大小的存储器堆上执行垃圾收集。
之前,用户已经被建议在存储器中预分配他们在过程期间预期使用的所有对象,以防止垃圾收集操作被执行。然而,这可能是不切实际的。特别地,托管代码的一个优点是生产力。如果开发人员需要花费大量时间来预分配预期的存储器对象,则他们可能认为使用托管代码的回报被减少。另外,如果开发人员不进行预期并且因此预分配对象,则当对象在运行时被分配时,垃圾收集可能会被触发。事实上,对象的分配通常是触发垃圾收集操作的原因。此外,一些库可能并不允许用户预分配对象。
本文中所要求保护的主题不限于解决只在诸如上述环境中的任何缺点或只在诸如上述环境中运行的实施例。相反,提供该背景技术以仅说明可以实践本文中描述的一些实施例的一个示例性技术领域。
发明内容
本文中说明的一个实施例包括可以在实施垃圾收集的托管代码计算环境中实践的方法。该方法包括用于控制垃圾收集操作的动作。该方法包括建立垃圾收集以收集在托管代码环境中不再使用的对象。该方法还包括接收指定期望的量的托管代码输入,在该期望的量内期望垃圾收集不被执行。该方法还包括执行计算操作以确定很可能被满足的期望的量。该方法还包括在该量内运行存储器操作而不运行初始化的垃圾收集。
另一实施例包括计算环境中的计算机可读存储设备。计算机可读存储设备包括计算机可执行指令,该计算机执行指令在由一个或多个处理器执行时使得用于控制垃圾收集的托管代码应用编程接口(API)被实施。API包括一个或多个字段的第一集合,该一个或多个字段的第一集合允许用户指定要被预提交用以于稍后的对象分配的存储器的量。一个或多个字段的第一集合允许用户指定要提交的总存储器大小、针对小对象堆要提交的存储器大小以及针对大对象堆要提交的存储器大小,使得至少总存储器大小在大对象堆和小对象堆的组合之间被提交。API还包括一个或多个字段的第二集合,该一个或多个字段的第二集合允许用户指定是否在预提交存储器的量之前阻塞垃圾收集。
提供本发明内容以便以简化的形式介绍在下面的具体实施方式中进一步描述的概念的选集。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
附加特征和优点将在下面的描述中阐述,并且部分地将从描述中显而易见,或者可以通过对本文中的教导的实践来了解。本发明的特征和优点可以通过所附权利要求中特别指出的仪器和组合来实现和获得。本发明的特征从下面的描述和所附权利要求中将变得更加显而易见,或者可以通过对下文中阐述的发明的实践来了解。
附图说明
为了描述可以获得以上记载和其它的优点和特征的方式,将通过参考在附图中图示的具体实施例来呈现上面简要描述的主题的更具体的描述。应当理解,这些附图仅描绘了典型的实施例,并且因此不应当被认为是在范围上的限制,将通过使用附图结合附加特征和细节来描述和解释实施例,在附图中:
图1图示了在托管代码环境中实施的系统,其包括垃圾收集器并且被配置为预提交存储器以防止发生垃圾收集;
图2图示了每个都具有预提交的部分的小对象堆和大对象堆;以及
图3图示了控制垃圾收集操作的方法。
具体实施方式
本文中的实施例可以实施针对托管代码应用的功能,以防止(或至少尝试防止)发生针对某些用户指定的量的垃圾收集。因此,例如,用户可以指定垃圾收集在某一给定时间段内不应当发生。实施例可以执行某些操作以确定垃圾收集是否能够针对指定的时间段而被暂停。这样的操作例如可以包括确定存储器中很可能存在足够空闲的存储器以暂停垃圾收集、预提交存储器的部分以满足用户指定的量、和/或简单地针对指定的时间段而关闭垃圾收集。在其他实施例中,用户可以指定其希望在不中断垃圾收集的情况下使用的存储器的量。此外,作为响应,系统可以执行各种操作,诸如确定存储器中很可能存在足够空闲的存储器以暂停垃圾收集、预提交存储器的部分以满足用户指定的量、和/或简单地针对指定的存储器访问量而关闭垃圾收集。
该功能可以用于在性能关键时间期间提高系统性能。通过防止资源密集型垃圾收集操作被执行,系统的整体性能可以被显著改善。
现在参考图1,其图示了系统102。系统102包括托管代码应用104。托管代码应用104是使用托管代码平台运行的应用。例如,托管代码应用104可以使用可用与.NETFramework一起使用的多个不同的高级编程语言之一来编写,其包括多种语言,诸如C#、J#、Microsoft Visual Basic.NET、Microsoft JScript.NET和托管C++。这些语言共享统一的一组类库,并且可以被编码为中间语言(IL)。运行时感知的编译器将IL编译为托管执行环境内的本地可执行代码,托管执行环境确保类型安全、数组绑定和索引检查、异常处理、以及垃圾收集。
图1还图示了对象堆106。对象堆106包括存储器,诸如系统RAM、使用系统存储器的虚拟存储器、或可以用于存储对象的其他存储器。对象堆106包括多个分段。系统102的操作系统可以指派分段以用于存储托管对象。分段是对象堆106的一部分,其已经由操作系统分配以将对象存储在用于在操作系统环境中运行的代码(诸如,托管代码应用)的存储器空间中。多个对象可以被存储在分段中。
对象可以包括随对象而变化的附加部分。例如,对象可以包括首部,首部包括关于对象的信息(包括诸如类类型、大小等信息)。对象可以包括对其他对象106的引用。另外,对象可以包括数据成员。数据成员可以包括原始低级数据,诸如整数、布尔值、浮点数、字符或字符串。
图1还图示了垃圾收集器(GC)108。GC可以游历堆106以标识不再需要的对象,使得用于那些对象的存储器可以被取回。当托管代码操作环境被启动时,GC通常会随托管代码操作环境被启动以执行垃圾收集活动。
如上所述,可能期望在一段时间内暂停或不运行垃圾收集以防止用户线程的暂停。然而,传统的想法是垃圾收集不应当被暂停。因此,本文中描述的各种实施例可以实施尝试防止垃圾收集在用户指定的某些量期间被执行的功能。
图1以虚线图示了开发人员自己可能尝试以防止垃圾收集操作被执行的在先实施的措施。特别地,图1图示了堆106中可能已经被预分配的特定对象的集合110。然而,这需要开发人员事先知道需要被分配的对象以便对它们进行分配,如果开发人员出错并且新对象需要被分配,则垃圾收集活动可能已经被执行,这违反了用户的意愿。此外,这可能使编程更加复杂和繁琐。
相反,本文中的实施例可以允许开发人员预提交堆106的一部分112。特别地,开发人员可以预提交具有用以防止垃圾收集活动被执行的尺寸的堆106的一部分112,可选地连同,用以设法确保垃圾收集活动不会启动的某些安全因素一起。例如,假设开发人员知道,在托管代码应用(诸如,集合110中的对象)的执行期间,将需要大约500MB的存储器用于对象分配。开发人员可以预提交堆106中的700MB的部分112,以提供安全因素。然而,在其他实施例中,系统102可以仅分配用户请求的500MB。用户可以负责请求附加的预提交的存储器数量。然后,应用可以根据需要为对象分配预提交的部分112中的空间。只要应用不需要向对象分配超过700MB,系统就可以保证垃圾收集活动不会被执行。虽然以上一般地说明了堆106,但是应当理解,诸如图2所示,堆106通常将被分成大对象堆(LOH)和小对象堆(SOH),图2中示出了小对象堆106-1和大对象堆106-2。如本文中使用的,小对象堆简言之是用于未在大对象堆中维持的其他对象的堆。因此,小对象只是其他对象,诸如那些没有足够大到被分类为大对象的对象。
实施例可以包括用于允许在LOH和SOH中的任一个或两个上预提交存储器的功能。附加地,实施例可以包括允许执行完全阻塞垃圾收集操作的功能。完全阻塞垃圾收集是收集整个堆的非并发收集。它是垃圾收集的一种形式,其可以丢弃托管堆中的所有可能的垃圾。在一代垃圾收集中,由于有时不在整个堆上执行垃圾收集,因而使用完全阻塞垃圾收集。在某些系统中,垃圾收集操作不是一代的(generational),这意味着所有垃圾收集操作都在所有堆上执行。实施例可以期望垃圾收集回收尽可能多的存储器,以增加在“无垃圾收集区域”开始之前具有足够的存储器以预提交用户所请求的内容的机会。在用户选择进行完全阻塞垃圾收集操作的情况下,一些实施例可以允许在预提交空间之前执行最少数量的垃圾收集,以在存储器中创建空间。例如,在一些实施例中,可以在SOH上执行最小垃圾收集操作以为SOH分配新的分段。这可以在SOH中提供足够的存储器的数量以执行预提交。在一些实施例中,可以调节分段大小以确保足够的存储器可用于预提交。然而,如果即使在如本文中描述的最小垃圾收集操作之后,仍没有足够的存储器可用,则实施例可以简单地返回存储器不能被预提交的指示。
下面说明可以用于实施该功能的应用编程接口(API)的细节。当实施用于预提交堆的多个部分的API时,可以考虑若干因素。这样的因素可以包括预提交的部分的大小、预提交的部分应当在哪里被提交(例如,LOH、SOH或两者)、以及是否应当执行完全阻塞垃圾收集操作。
实施例可以包括允许开发人员指定预提交的部分的总大小的API。下面说明示例API调用:
public staticbool TryStartNoGCRegion(long totalSize);
在该示例中,totalSize是开发人员在不触发任何垃圾收集的情况下所期望分配的大小。注意,该大小包括在此期间发生的所有分配,即其包括框架代表用户所做出的分配。对于GC,框架分配和终端用户代码分配之间没有区别。
垃圾收集器通常区分大对象和其他较小对象。大对象被特别处理。如果是这样,API可以给用户选择以指定大对象堆和小对象堆上的分配。以下是提交不执行垃圾收集的区域的起点的API示例:
public staticbool TryStartNoGCRegion(long totalSize,long lohSize);
在该示例中,开发人员可以指示总提交以提交总大小中总共有多少个字节将是LOH提交。系统可以确保为LOH预提交了那么多字节,并且其余字节用于SOH。在上面的示例中,开发人员通过在lohSize中指定LOH预提交字节来实现。
在一些实施例中,如果没有指定lohSize,则实施例可以实施保守的方法,并且将通过提交用于SOH分配的totalSize以及用于LOH分配的totalSize来提交(2*totalSize)总大小,以确保足够量的存储器。
在一些实施例中,如果没有足够的存储器可用于提交期望的存储器量,则默认行为是执行完全阻塞GC以获得更多的存储器。但是,如果开发人员不想完全阻塞垃圾收集引发的中断,由于这样的操作可能需要大量的时间,开发人员可以规应当不允许完全阻塞垃圾收集操作。考虑以下两个示例API调用:
public staticbool TryStartNoGCRegion(long totalSize,booldisallowFullBlockingGC);
public staticbool TryStartNoGCRegion(long totalSize,long lohSize,booldisallowFullBlockingGC);
在这些示例中,通过指定disallowFullBlockingGC为true,将不执行完全阻塞GC操作。相反,如果需要更多存储器,实施例可以尝试提交所请求的存储器而不使用GC阻塞操作或者使用最小阻塞GC操作。这例如对于负载平衡场景可能是有用的,其中如果API返回成功(指示所请求的提交已经被执行而无需执行完全阻塞GC操作),则一个机器(例如,系统102(当被实施在多个这样的系统之间时))可以适时地调用该API并且报告自己已经准备好接受请求。备选地,如果API没有返回成功,则机器可以具有对于其他机器的负载平衡器重定向请求。在这种情况下,机器可以在不处理请求时自行执行完全阻塞GC。
如上所述,实施例可以允许API提供一个或多个返回值。在所示示例中,以下表示API可以返回的一些可能的返回值:
true-该返回值指示系统成功提交所需要的存储器量,并且如果用户使用小于或等于他们指定的量来分配对象,则他们不会被GC中断。
false-该返回值指示没有足够的存储器以提交指定的存储器量。
ArgumentOutOfRangeException-该返回值指示系统无法允许用户为SOH请求多于一个分段大小的存储器。
InvalidOperationException-该返回值指示过程已经处于该模式,即某人已经调用了StartNoGCRegion。注意,在所示示例中,该调用不能嵌套。
API的实施例还可以包括用于结束不执行垃圾收集的模式的功能。例如,API可以允许以下调用(或类似的调用)使得垃圾收集恢复为最初为针对环境的最初初始化状态:
public static void EndNoGCRegion();
API可以允许各种异常。以下说明了其可以在本文中作为InvalidOperationException而被提供和说明的异常的样本。如果无GC区域模式没有生效(例如,在所示示例中,如果StartNoGCRegion未被调用或未成功),则可能会触发此异常。备选地或附加地,当在调用EndNoGCRegion(其结束无垃圾收集区域模式)之前引发垃圾收集操作时,可能会触发此异常。备选地或附加地,当分配给对象的存储器的量超过调用API时所指定的量时,可能会触发此异常。
现在说明API的一个示例使用情况,用户可以测试他们的场景,以计算出要在性能关键路径上分配多少存储器。当他们要进入这个路径时,他们调用启动API以使用他们需要分配的字节数来启动“无GC区域”。在完成之后,他们调用结束API以结束此区域。在这个区域期间,如果用户没有超过他们指定的分配量,则垃圾收集操作将不会发生。
以下讨论现在参考可以被执行的多种方法和方法动作。尽管方法动作可以按照特定顺序进行讨论或者在流程图中被图示为以特定顺序发生,但是除非因为动作取决于在该动作被执行之前的另一动作被完成而具体地说明或需求,否则不需要特别的顺序。
现在参考图3,其图示了方法300。该方法可以在实施垃圾收集的托管代码计算环境中实践。方法300包括用于控制垃圾收集操作的动作。
方法300包括建立垃圾收集以收集托管代码环境中不再使用的对象(动作300)。例如,图1图示了垃圾收集器108。由于系统102运行诸如托管代码应用104等托管代码应用这一事实,垃圾收集器108可以被包括在系统102中。因此,由于系统102具有被建立并且初始化以在系统102上运行的垃圾收集器,因此系统102可以被配置为执行垃圾收集活动。在没有另外的干预的情况下,垃圾收集器108将尝试根据需要(例如,当尝试对象分配,并且在堆106中需要更多的存储器空间以满足尝试的分配时)回收堆106中的存储器。
方法300还包括接收指定期望的量的托管代码输入,在期望的量内期望垃圾收集不被执行(动作304)。如本文之前所说明的,这可以以很多不同的方式来实现。例如,在一些实施例中,可以指定要预提交的存储器的数量。在备选环境中,用户可以指定用户希望不执行垃圾收集活动的时间量。在这种情况下,系统可以尝试提交一定数量的存储器,这些存储器应当足够在用户指定的时间段内分配对象。这可以基于历史、统计、启发式等分析,这些分析基于预期要由系统执行的操作类型。注意,不同的实施例具有不同的保证级别。例如,当存储器被预提交时,系统可以保证只要不超出预提交来分配对象,就不会发生垃圾收集。相反,当实施例仅做出基于启发的猜测时,这将不是保证。
方法300还可以包括执行计算操作以确定期望的量很可能能够被满足(动作306)。例如,这可以包括分析可用的存储器并且确定在不执行垃圾收集操作的情况下量很可能被满足。附加地或备选地,这可以包括系统提交经确定的存储器数量来确保在不执行垃圾收集操作的情况下运行操作的能力。如果用户指定了在不运行垃圾收集操作的情况下应当运行的存储器分配的量,则实施例可以预提交一定数量的存储器,并且因此可以保证只要对象分配保持低于指定的存储器量,则垃圾收集操作将不会运行。
方法300还包括在量内运行存储器操作而不运行初始化的垃圾收集。
方法300可以在计算操作包括完全停用经建立的垃圾收集的情况下被实践。因此,例如,系统102中的垃圾收集器108可以被完全停用,使得无论存储器堆106中发生什么,垃圾收集都将不会发生。尽管这可能导致存储堆106中的错误,但是实施例可以允许这样的功能被实施。
方法300还可以包括接收指定垃圾收集可以运行的输入,并且因此按照所建立的垃圾收集执行垃圾收集操作。因此,例如,在一些实施例中,如果垃圾收集器108已经被停用,则可以重新启用垃圾收集器108。或者,因为用户指定的量已经被满足,垃圾收集器108可以运行。
如上所述,方法300可以被实践,其中用于确定期望的量很可能能够被满足的操作包括:对存储器执行启发式分析以基于对存储器的过去的操作来确定期望的量很可能被满足。因此,例如,实施例可以历史上地分析在托管应用的实例运行时发生了什么,并且基于该历史来确定量是否很可能能够被满足。
方法300可以被实践,其中用于确定期望的量很可能能够被满足的操作包括:提交用于稍后的对象分配的一个或多个存储器区域来满足期望的量。例如,本文中之前描述的API可以用于提交该量大小的堆106的部分。下面将说明各种备选方案。
因此,方法300可以被实践,其中输入指定要提交的存储器大小。在该实施例的一些这样的示例中,方法300还可以包括:基于输入,提交至少在大对象堆中指定的存储器大小以及至少在小对象堆中指定的存储器大小。因此,至少两倍于输入中指定的存储器大小的量在大对象堆和小对象堆的组合之间被提交。这在图2中被图示。图2图示了堆106。堆106包括小对象堆106-1和大对象堆106-2。由于在用户输入中仅指定了总存储器大小,所以系统102不知道大对象堆或小对象堆中的存储器是否应当被提交。因此,系统可以提交小对象堆106-1中的部分112-1和大对象堆106-2中的部分112-2。
在备选实施例中,输入指定可以用于标识要提交的总存储器大小、针对小对象堆要提交的存储器大小、和针对大对象堆要提交的存储器大小的信息。在上面的API示例中,这是通过指定在存储器(特别是堆)中提交的总大小和在大对象堆中提交的大小来完成的,从中可以通过简单的减法来计算要在小对象堆中提交的大小。然而,各种备选方案可以被使用。例如,实施例可以允许用户指定要在存储器中提交的总大小以及要在小对象堆中提交的大小。在另一备选方案中,实施例可以允许用户指定要在大对象堆中提交的大小以及要在小对象堆中提交的大小。在任何情况下,指定可以被用于表示要提交的总存储器大小、针对小对象堆要提交的存储器大小、和针对大对象堆要提交的存储器大小的信息的输入被执行,使得至少在输入中的信息中指定的总存储器大小在大对象堆和小对象堆的组合之间被提交。
在方法300的一些实施例中,方法可以被实践,其中输入指定在提交所指定的存储器大小时应当停用完全阻塞垃圾收集。这可以针对非常时间敏感的应用来被执行,该应用期望执行完全垃圾收集操作的昂贵的操作不应当被执行。
在其中接收到指定在提交所指定的存储器大小时应当停用完全阻塞垃圾收集的输入的一些这样的实施例中,方法300还可以包括:确定存在足够的存储器空间来用于在提交空间之前不运行任何垃圾收集的情况下提交所指定的存储器大小,并且因此至少提交存储器中指定的存储器大小。
备选地,在其中接收到指定在提交所指定的存储器大小时应当停用完全阻塞垃圾收集的输入的一些这样的实施例中,方法300可以确定在不运行任何垃圾收集的情况下,没有足够的空间来提交所指定的存储器大小;因此,执行最小阻塞垃圾收集以获取小对象堆中的连续的存储器区域;确定连续的存储器区域足以提交所指定的存储器大小;因此,至少提交所指定的存储器大小。在备选示例中,系统可以执行年轻一代(young generation)收集以收集堆的部分。各种其他备选方案可以在备选或附加实施例中被实施。
方法300可以确定没有足够的存储器空间来提交所指定的存储器大小,并且因此返回指示未提交存储器的指示符。这可以在各种备选方案中被执行。例如,在一些实施例中,这可以在完全阻塞被停用并且不尝试最小垃圾收集的情况下被执行。备选地,这可以在执行完全阻塞或最小垃圾收集并且确定仍然没有足够的存储器来提交所请求的大小之后发生。
在方法300的一些实施例中,根据权利要求6所述的方法还包括:返回指示所指定的存储器大小在存储器中被提交的指示符。例如,如上所述,当用户指定的存储器的量能够被提交时,将从调用API返回true值。
此外,该方法可以由包括一个或多个处理器和诸如计算机存储器等计算机可读介质的计算机系统来实践。特别地,计算机存储器可以存储当被一个或多个处理器执行时使得各种功能(诸如实施例中描述的动作)被执行的计算机可执行指令。
如下面更详细地讨论的,本发明的实施例可以包括或利用包括计算机硬件的专用或通用计算机。在本发明范围内的实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质能够是由通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。携带计算机可执行指令的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种明显不同类型的计算机可读介质:物理计算机可读存储介质和传输计算机可读介质。
物理计算机可读存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储器(诸如CD、DVD等)、磁盘存储装置或其他磁存储设备、或者可以用于以计算机可执行指令或数据结构的形式来存储期望的程序代码手段并且能够由通用或专用计算机访问的任何其他介质。
“网络”被定义为使得能够在计算机系统和/或模块和/或其他电子设备之间传送电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或者硬连线或无线的组合)被传输或提供给计算机时,计算机将连接正确地视为传输介质。传输介质可以包括网络和/或数据链路,网络或数据链路可以被用于以计算机可执行指令或数据结构的形式携带或存储期望的程序代码装置,并且其可以由通用或专用计算机访问。以上的组合也被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统部件时,计算机可执行指令或数据结构形式的程序代码手段被自动地从传输计算机可读介质传送到物理计算机可读存储介质(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以被缓冲在网络接口模块(例如,“NIC”)内的RAM中,并且然后最终被传送到计算机系统RAM和/或计算机系统处的较低易失性计算机可读物理存储介质。因此,计算机可读物理存储介质可以被包括在也(或甚至主要)利用传输介质的计算机系统部件中。
计算机可执行指令包括例如使得通用计算机、专用计算机或专用处理设备执行某一功能或功能组的指令和数据。计算机可执行指令可以是例如二进制文件、中间格式指令(诸如汇编语言)、或者甚至源代码。虽然主题已经用特定于结构特征和/或方法动作的语言被描述,但是应当理解,所附权利要求中限定的主题不必限于以上描述的特征或动作。相反,所描述的特征和动作作为实现权利要求的示例形式被公开。
本领域技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程消费电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中被实践,其中通过网络链接(通过硬连线数据链路、无线数据链路、或通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。在分布式系统环境中,程序模块可以位于本地和远程存储设备二者中。
备选地或附加地,本文中描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。作为示例而非限制,可以使用的说明性类型的硬件逻辑部件包括现场可编程门阵列(FPGA)、特定应用集成电路(ASIC)、特定应用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)等。
在不脱离本发明的精神或特征的情况下,本发明可以以其他具体形式来实施。所描述的实施例在所有方面被认为仅是说明性的而非限制性的。因此,本发明的范围由所附权利要求而不是之前的描述来指示。在权利要求的等同的含义和范围内的所有变化都将被包括在其范围内。

Claims (10)

1.一种用于控制托管代码计算环境中的垃圾收集操作的计算系统,所述系统包括:
一个或多个处理器;以及
一个或多个计算机可读介质,其中所述一个或多个计算机可读介质包括计算机可执行指令,所述计算机可执行指令在由所述一个或多个处理器中的至少一个处理器执行时使得所述系统执行以下操作:
建立垃圾收集以收集托管代码环境中不再使用的对象;
接收指定期望的量的托管代码输入,在所述期望的量内期望垃圾收集不被执行;
执行计算操作以确定所述期望的量很可能能够被满足;以及
在所述量内运行存储器操作而不运行初始化的所述垃圾收集。
2.根据权利要求1所述的系统,其中用以确定所述期望的量很可能能够被满足的所述计算操作包括:停用所建立的所述垃圾收集。
3.根据权利要求1所述的系统,其中所述系统还执行以下操作:
接收指定垃圾收集能够运行的输入,并且因此按照所建立的所述垃圾收集执行垃圾收集操作。
4.根据权利要求1所述的系统,其中用以确定所述期望的量很可能能够被满足的所述操作包括:对存储器执行启发式分析以基于对所述存储器的过去的操作来确定所述期望的量很可能能够被满足。
5.根据权利要求1所述的系统,其中用以确定所述期望的量很可能能够被满足的所述操作包括:提交用于稍后的对象分配的一个或多个存储器区域以满足所述期望的量。
6.根据权利要求1所述的系统,其中所述输入指定要提交的存储器大小。
7.根据权利要求6所述的系统,其中所述系统是其中对象基于所述对象的大小而被分离的系统,其中较大对象在所述较大对象自己的堆中被处理,并且其中所述系统还执行以下操作:
基于所述输入,提交至少在大对象堆中所指定的所述存储器大小和至少在小对象堆中所指定的所述存储器大小,使得所述输入中指定的所述存储器大小的数量的至少两倍在所述大对象堆和所述小对象堆的组合之间被提交。
8.根据权利要求6所述的系统,其中所述输入指定能够用于标识要提交的总存储器大小、针对小对象堆要提交的存储器大小和针对大对象堆要提交的存储器大小的信息,使得至少如所述输入中的所述信息中所指定的所述总存储器大小在所述大对象堆和所述小对象堆的所述组合之间被提交。
9.一种用于控制托管代码计算环境中的垃圾收集操作的计算机实施的方法,所述计算机实施的方法由一个或多个处理器执行,所述一个或多个处理器在执行用于所述计算机实施的方法的可执行指令时,使得所述一个或多个处理器实施所述方法,所述方法包括:
建立垃圾收集以收集托管代码环境中不再使用的对象;
接收指定期望的量的托管代码输入,在所述期望的量内期望垃圾收集不被执行;
执行计算操作以确定所述期望的量很可能能够被满足;以及
在所述量内运行存储器操作而不运行初始化的所述垃圾收集。
10.一种计算系统,包括一个或多个处理器,所述一个或多个处理器在执行计算机可执行指令时,使得所述计算系统利用控制托管代码计算环境中的垃圾收集的应用编程接口(API)进行操作,并且所述API包括:
一个或多个字段的第一集合,一个或多个字段的所述第一集合允许用户指定要被预提交以用于稍后的对象分配的存储器的数量,其中一个或多个字段的所述第一集合允许所述用户指定要提交的总存储器大小、针对小对象堆要提交的存储器大小和针对大对象堆要提交的存储器大小的信息,使得至少所述总存储器大小在所述大对象堆和所述小对象堆的组合之间被提交;以及
一个或多个字段的第二集合,一个或多个字段的所述第二集合允许用户指定是否要在预提交存储器的所述数量之前阻塞垃圾收集。
CN201680010066.6A 2015-02-13 2016-02-11 用于托管代码中的垃圾收集控制的系统和方法 Active CN107257959B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/622,196 US9804962B2 (en) 2015-02-13 2015-02-13 Garbage collection control in managed code
US14/622,196 2015-02-13
PCT/US2016/017428 WO2016130732A1 (en) 2015-02-13 2016-02-11 Garbage collection control in managed code

Publications (2)

Publication Number Publication Date
CN107257959A true CN107257959A (zh) 2017-10-17
CN107257959B CN107257959B (zh) 2020-08-28

Family

ID=55453287

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201680010066.6A Active CN107257959B (zh) 2015-02-13 2016-02-11 用于托管代码中的垃圾收集控制的系统和方法

Country Status (3)

Country Link
US (1) US9804962B2 (zh)
CN (1) CN107257959B (zh)
WO (1) WO2016130732A1 (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9940234B2 (en) * 2015-03-26 2018-04-10 Pure Storage, Inc. Aggressive data deduplication using lazy garbage collection
US10417125B2 (en) * 2016-02-11 2019-09-17 Oracle International Corporation Feedback-based selection of regions for abortable garbage collection
US10740230B2 (en) * 2016-10-20 2020-08-11 International Business Machines Corporation Heap contraction for increasing memory density in cloud environment
US10572181B2 (en) * 2017-02-01 2020-02-25 Microsoft Technology Licensing, Llc Multiple stage garbage collector
US10628306B2 (en) 2017-02-01 2020-04-21 Microsoft Technology Licensing, Llc Garbage collector
US10802965B2 (en) 2019-02-05 2020-10-13 Microsoft Technology Licensing, Llc Reducing synchronization reliance in garbage collection marking
US11068393B2 (en) 2019-10-17 2021-07-20 Microsoft Technology Licensing, Llc Enhanced concurrency garbage collection stack scanning
US11422932B2 (en) 2019-12-20 2022-08-23 Microsoft Technology Licensing, Llc Integrated reference and secondary marking
US11392427B2 (en) 2020-01-06 2022-07-19 Microsoft Technology Licensing, Llc Lock-free reading of unitary value sets
US11954023B2 (en) 2022-07-20 2024-04-09 Microsoft Technology Licensing, Llc Garbage collection prefetching state machine

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5842016A (en) * 1997-05-29 1998-11-24 Microsoft Corporation Thread synchronization in a garbage-collected system using execution barriers
CN101595460A (zh) * 2005-05-13 2009-12-02 微软公司 用于收集非托管存储空间的实现
CN102576331A (zh) * 2009-09-21 2012-07-11 甲骨文国际公司 用于在虚拟机监视器环境中的虚拟机之间同步瞬时资源使用的系统和方法
CN103530237A (zh) * 2013-10-31 2014-01-22 厦门大学 一种固态盘阵列的垃圾回收方法
US8892610B1 (en) * 2011-07-29 2014-11-18 Google Inc. System and method for garbage collection pause reduction

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2136154C (en) 1994-11-18 1999-08-24 Jay William Benayon User control of multiple memory heaps
US5933840A (en) 1997-05-19 1999-08-03 International Business Machines Corporation Garbage collection in log-structured information storage systems using age threshold selection of segments
US6701520B1 (en) 1999-05-11 2004-03-02 International Business Machines Corporation Preventing garbage collection of objects in object oriented computer programming languages
US6457142B1 (en) 1999-10-29 2002-09-24 Lucent Technologies Inc. Method and apparatus for target application program supervision
US6898602B2 (en) 2002-04-22 2005-05-24 Sun Microsystems Inc. Measuring the exact memory requirement of an application through intensive use of garbage collector
US7114045B1 (en) 2003-12-23 2006-09-26 Sun Microsystems, Inc. Garbage collection with a dynamic window
US7624137B2 (en) 2004-01-05 2009-11-24 International Business Machines Corporation Method and apparatus for scheduling and performing garbage collection in a real-time system with guaranteed space bounds
US7484067B1 (en) 2004-05-24 2009-01-27 Sun Microsystems, Inc. System and method for ensuring non-interfering garbage collection in a real time multi-threaded environment
US7962707B2 (en) * 2005-07-06 2011-06-14 Honeywell International Inc. Apparatus and method for deterministic garbage collection of a heap memory
US7672983B2 (en) 2005-12-19 2010-03-02 Sun Microsystems, Inc. Method and apparatus for tracking activity of a garbage collector with a plurality of threads that operate concurrently with an application program
US7774389B2 (en) 2007-01-17 2010-08-10 Microsoft Corporation Optimized garbage collection techniques
US8266190B2 (en) 2007-09-25 2012-09-11 International Business Machines Corporation Memory management for garbage collection of critical real time threads
US8347061B2 (en) 2008-04-29 2013-01-01 International Business Machines Corporation Method for protecting user-managed memory using an exception
US8429658B2 (en) 2008-10-16 2013-04-23 International Business Machines Corporation Lock deferral for real-time garbage collection
US20100153675A1 (en) 2008-12-12 2010-06-17 Microsoft Corporation Management of Native Memory Usage
US8250121B2 (en) * 2009-11-18 2012-08-21 Oracle America, Inc. Zero-copy maturing of large objects in generational heap with copying collection
US8799615B2 (en) * 2010-10-21 2014-08-05 International Business Machines Corporation Organization of a small object area and a large object area in a java heap
US8825721B2 (en) 2011-10-03 2014-09-02 Oracle International Corporation Time-based object aging for generational garbage collectors

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5842016A (en) * 1997-05-29 1998-11-24 Microsoft Corporation Thread synchronization in a garbage-collected system using execution barriers
CN101595460A (zh) * 2005-05-13 2009-12-02 微软公司 用于收集非托管存储空间的实现
CN102576331A (zh) * 2009-09-21 2012-07-11 甲骨文国际公司 用于在虚拟机监视器环境中的虚拟机之间同步瞬时资源使用的系统和方法
US8892610B1 (en) * 2011-07-29 2014-11-18 Google Inc. System and method for garbage collection pause reduction
CN103530237A (zh) * 2013-10-31 2014-01-22 厦门大学 一种固态盘阵列的垃圾回收方法

Also Published As

Publication number Publication date
WO2016130732A1 (en) 2016-08-18
US9804962B2 (en) 2017-10-31
CN107257959B (zh) 2020-08-28
US20160239413A1 (en) 2016-08-18

Similar Documents

Publication Publication Date Title
CN107257959A (zh) 托管代码中的垃圾收集控制
US10936555B2 (en) Automated query compliance analysis
US9443101B2 (en) Low-cost specification and enforcement of a privacy-by-consent-policy for online services
US20160070560A1 (en) System and method for updating or modifying an application without manual coding
CN106462414A (zh) 特化类的依赖性驱动的共同特化
KR20160002888A (ko) 애플리케이션 내의 대역외 프레임워크 라이브러리
US20080140671A1 (en) Extensible application platform
US8813051B2 (en) Running multiple copies of native code in a Java Virtual Machine
US11907941B2 (en) Anonymization of data fields in transactions
CN103632219A (zh) 用于重新分配用于检查数据质量的作业的方法和系统
Magill et al. Automating object transformations for dynamic software updating
CN102027460A (zh) 动态声明性应用程序描述
Biagiola et al. Search based path and input data generation for web application testing
Adelsberger et al. Towards assessing the complexity of object migration in dynamic, feature-oriented software product lines
De Boer et al. Formal specification and verification of JDK’s identity hash map implementation
Moreno Summarization of complex software artifacts
Marot et al. Composing aspects with aspects
Khatchadourian et al. Detecting broken pointcuts using structural commonality and degree of interest
Eichberg et al. Automatic incrementalization of prolog based static analyses
JP6506201B2 (ja) 目的変数に対応する説明変数群を決定するシステム及び方法
Lerman et al. Programming entity framework: DbContext
US8359658B2 (en) Secure authoring and execution of user-entered database programming
Afonin et al. Validation of safety-like properties for entity-based access control policies
Lagniez et al. An assumption-based approach for solving the minimal S5-satisfiability problem
US20140129934A1 (en) Dynamic model-based management tooling

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant