CN114051610A - 基于arena的存储器管理 - Google Patents
基于arena的存储器管理 Download PDFInfo
- Publication number
- CN114051610A CN114051610A CN202080042235.0A CN202080042235A CN114051610A CN 114051610 A CN114051610 A CN 114051610A CN 202080042235 A CN202080042235 A CN 202080042235A CN 114051610 A CN114051610 A CN 114051610A
- Authority
- CN
- China
- Prior art keywords
- arena
- objects
- memory
- heap
- garbage collection
- 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.)
- Pending
Links
Images
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
- 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/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
- G06F12/0276—Generational garbage collection
-
- 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/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1008—Correctness of operation, e.g. memory ordering
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
- G06F2212/1044—Space efficiency improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/70—Details relating to dynamic memory management
Abstract
公开了基于arena的存储器管理系统。响应于用于回收存储被分配在arena中的对象组的存储器的调用,被分配在arena中的对象组中的不使用的对象被收集(302)。多个对象中的活动对象从arena被复制到堆(304)。
Description
背景技术
计算机系统中两种常见的存储器管理技术包括手动存储器管理和垃圾收集。手动存储器管理包括程序员显式的存储器分配和解除分配,诸如使用C编程语言标准库中的malloc()和free()函数或C++编程语言中的new和delete运算符。垃圾收集是自动存储器管理形式,其试图检测计算机系统上的软件应用或程序不再使用的对象,并且恢复由计算机系统上运行的软件应用或程序不再使用的对象所占用的存储器。在非托管编程语言(诸如C++)中使用的另一存储器管理技术是基于arena的存储器分配。基于arena的存储器管理技术也被称为基于区域、基于区和基于组的存储器技术。在基于arena的存储器管理系统中,每个分配的对象被放置在程序指定的arena中。通过销毁arena并释放arena中所有分配的对象来回收存储器。
发明内容
提供本发明内容以在以下的描述中进一步描述的简化形式引入概念的选择。本发明内容不旨在标识所要求保护的主题的关键特征或基本特征,也不旨在用于限制所要求保护的主题的范围。
手动存储器管理技术依赖于程序员来确定哪个对象可以被安全删除以及对象是否可以被安全删除。如果对象被过早删除,程序的不同部分可能会尝试使用相同的存储器来用于不同的目的。如果对象被删除太晚或根本没有删除,程序中可能会发生存储器泄漏。垃圾收集技术可以解决手动存储器管理技术的危害,但可能比适当的手动存储器管理技术使用更多的存储器或更多的执行时间。通常,arenas在软件应用中是显式的并且被程序员控制,并且可以通过程序员显式的存储器分配和解除分配来提高程序性能,但不解决依赖于程序员来确定哪个对象可以被安全删除以及对象是否可以被安全删除的问题。
本公开针对托管(managed)环境,托管环境可以包括垃圾收集,但允许程序员表达对具有公共生命期的对象的分组,因为对象组中的许多对象在公共生命期结束时,可以在程序员的确定下被收集。此外,托管环境可以允许某些对象在公共生命期存活,这解决了程序员错误地过早删除对象的问题。对象可能用具有公共生命期的组来表达的场景可以包括服务器环境,在服务器环境中,对象组被分配在一起来服务于请求。一旦请求已被服务,许多(如果不是全部)对象就可以被收集。另一个场景可以包括编译器或语言翻译器。对象通常被分配在一起而形成翻译单元(诸如模块或方法)的中间表示。一旦翻译完成,许多(如果不是全部)中间表示就可以被收集。收集的对象可以被删除。
在一个示例中,本公开提供了基于arena的存储器管理系统。响应于用于回收存储被分配在arena中的对象的存储器的调用,arena中的不使用的对象被收集。arena中的活动对象从arena被复制到垃圾收集服务的堆。
附图说明
附图被包括来提供对实施例的进一步理解并且被并入并构成本公开的一部分。附图图示了实施例并且与描述一起用于解释实施例的原理。其他实施例和实施例的许多预期优点将容易理解,因为它们通过参考以下描述变得更好理解。附图的元素不必相对于彼此成比例。相同的附图标记表示对应的相似部件。
图1是图示了计算设备的示例的框图,计算设备可以被配置在计算机网络中来提供例如云计算环境。
图2是图示了用于在图1的计算设备中执行的示例性基于arena的存储器管理框架的框图。
图3是图示了图2的基于arena的存储器管理框架的示例方法的框图。
具体实施方式
在以下的具体实施方式中,参考了形成其一部分的附图,并且其中通过示例的方式图示了可以实践本发明的特定实施例。应当理解,在不脱离本发明的范围的情况下,可以利用其他实施例并且可以进行结构或逻辑改变。以下描述因此不应被视为限制意义。应当理解,除非另外特别指出,否则本文描述的各种示例实施例的特征可以部分或全部彼此组合。
图1图示了示例性计算机系统,示例性计算机系统可以在操作环境中被采用,并且被用于托管或运行包括在一个或多个计算机可读存储介质上的计算机应用,计算机可读存储介质存储用于控制计算机系统(诸如计算设备)的计算机可执行指令来执行进程。计算机实现的进程的示例包括并发垃圾收集,并发垃圾收集可以被存储在计算机存储器中并且利用处理器来执行,以根据基于先前垃圾收集的动态可调参数来触发。
示例性计算机系统包括计算设备,诸如计算设备100。在基本硬件配置中,计算设备100通常包括具有一个或多个处理单元(即,处理器102)和存储器104的处理器系统。例如,处理单元可以包括在一个芯片上的两个或更多个处理核心或者两个或更多个处理器芯片。在一些示例中,计算设备还可以具有一个或多个附加处理或专用处理器(未示出),诸如用于在图形处理器单元上进行通用计算的图形处理器,以执行从处理器102卸载的处理功能。存储器104可以以分层结构来布置,并且可以包括一个或多个级别的高速缓存。根据计算设备的配置和类型,存储器104可以是易失性的(诸如随机存取存储器(RAM))、非易失性的(诸如只读存储器(ROM)、闪存等)或者两者的一些组合。计算设备100可以采用多种形式中的一个或多个。这样的形式包括平板电脑、个人计算机、工作站、服务器、手持设备、消费电子设备(诸如视频游戏控制台或数字录像机)等,并且可以是独立设备或者被配置为计算机网络的一部分。
计算设备100还可以具有附加的特征或功能。例如,计算设备100还可以包括附加存储装置。这样的存储装置可以是可移除和/或不可移除的,并且可以包括磁盘或光盘、固态存储器或闪存设备,诸如可可移除存储装置108和不可移除存储装置110。计算机存储介质包括以用于存储信息的任何合适的方法或技术实现的易失性和非易失性、可移除和不可移除介质,诸如计算机可读指令、数据结构、程序模块或其他数据。存储器104、可移除存储装置108和不可移除存储装置110均是计算机存储介质的示例。计算机存储介质包括RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字多功能光盘(DVD)或其他光学存储装置、磁带盒、磁带、磁盘存储装置或其他磁存储设备、通用串行总线(USB)闪存驱动装置、闪存卡或其他闪存设备或者可以被用于存储所需信息并且可以由计算设备100访问的任何其他存储介质。因此,传播信号本身不符合条件作为存储介质。任何此类计算机存储介质均可以是计算设备100的一部分。
计算设备100通常包括一个或多个输入和/或输出连接,诸如USB连接、显示器端口、专有连接和连接到各种设备来向计算设备提供输入和输出的其他连接。输入设备112可以包括诸如键盘、定点设备(例如,鼠标、轨迹板)、指示笔、语音输入设备、触摸输入设备(例如,触摸屏)等的设备。输出设备111可以包括诸如显示器、扬声器、打印机等的设备。
计算设备100通常包括允许计算设备100与其他计算机/应用115通信的一个或多个通信连接114。示例通信连接可以包括以太网接口、无线接口、总线接口、存储区域网络接口以及专有接口。通信连接可以被用于将计算设备100耦合到计算机网络,计算机网络可以根据诸如拓扑、连接方法和规模的多种特性进行分类。网络是由通信信道互连的计算设备和可能的其他设备的集合,通信信道促进通信并且允许在互连设备之间共享资源和信息。计算机网络的示例包括局域网、广域网、互联网或其他网络。
计算设备100可以被配置为运行构成系统平台的操作系统软件程序和一个或多个计算机应用。被配置为在计算设备100上执行的计算机应用包括至少一个进程(或任务),至少一个进程是执行程序。每个进程提供执行程序的资源。一个或多个线程在进程上下文中运行。线程是操作系统在处理器102中为其分配时间的基本单元。线程是进程内可以被调度来执行的实体。进程的线程可以共享其虚拟地址空间和系统资源。每个线程可以包括异常处理程序、调度优先级、线程本地存储、线程标识符和线程上下文或线程状态,直到线程被调度。线程上下文包括线程的机器寄存器集、内核栈、线程环境块以及与线程对应的进程地址空间中的用户栈。线程在处理期间可以借助诸如消息传递的技术而彼此通信。
操作可以在与主应用线程分离的线程中执行。当应用调用方法来执行操作时,应用可以在方法执行其任务的同时,继续在其线程上执行。共享存储器多处理器的并发编程可以包括多个线程访问相同数据的能力。共享存储器模型是最常部署的多线程通信方法。多个线程在多个处理器、多个处理器内核、单个处理器内核中的多个逻辑节点和/或与处理器之间共享的存储器附接的其他并行类上执行。
本公开总体上涉及将基于arena的存储器管理系统与数据处理系统中(诸如计算设备100)与编程语言或运行时系统一起使用的垃圾收集进行组合的存储器管理技术。本公开的各方面可以被体现为系统、方法或计算机程序产品。因此,本公开的各方面可以采取完全硬件、完全软件或者通常可以被称为系统的软件和硬件方面的组合的形式,软件包括固件、常驻软件、微代码。此外,本公开的各方面可以采用计算机程序产品的形式,计算机程序产品包括一个或多个计算机可读介质或具有用于使得处理器执行本公开的各方面的计算机可读程序指令的介质。
图2图示了可以在计算设备100上实现的示例软件框架200的特征。框架200可以与开发者编写的软件应用或程序一起使用,应用或程序以一个或多个框架兼容的语言而针对一个或多个平台来创建。示例框架200包括具有运行时库和基类库的类库202以及诸如运行时系统204、虚拟机或软件容器的应用引擎。在一个示例中,类库202包括由命名空间组织的类集合,以定义在框架兼容的编程语言中可用的特征。在一些实现方式中,以框架兼容语言编写的软件应用作为源代码被编译为平台中立语言或字节码,平台中立语言或字节码可以在平台(诸如计算设备100)上安装的平台特定虚拟机中执行。运行时系统204将字节码编译为在平台上执行的机器代码。运行时系统204可以提供附加的服务,包括存储器管理、类型安全、异常处理、垃圾收集、安全和线程管理。在执行开发者编写的程序时,运行时系统204的平台特定即时编译器210将字节码翻译为机器码。编译器210可以提供提前编译和解释的组合,并且运行时系统204可以处理晚绑定数据类型并强制执行安全保证。
该示例的类库202可以包括根据所公开的方法实现的一个或多个类206。一般而言,类206是用于创建对象、提供状态的初始值和实现行为的可扩展程序代码模板或蓝图。类是一种构造,它使得开发人员能够通过将其他类型、方法和事件的变量组合在一起来创建自定义类型。一个或多个类206可以包括类变量、实例变量、局部变量、参数、用户定义的方法、继承的状态和行为以及接口。变量可以保留在存储器104中,直到被基于arena的存储器管理系统删除。这时,运行时系统204可以经由垃圾收集器208将变量标记为适合垃圾收集。
类库202可以包括为基于arena的存储器管理提供的功能或支持运算符,在基于arena的存储器管理中,每个分配的对象被分配给arena。在一个实现方式中,arena中的所有对象可以被分配在存储器104中的单个连续存储器地址范围内。多个arena可以同时活动,并且与每个arena对应的每个存储器地址范围可以与其他分配的arena不连续。在一个示例中,每个arena被实现为存储器104中的存储器段(诸如大存储器块)的数据结构(诸如链表),在存储器104中每个块可以用于多次分配。段维护指向块中下一空闲位置的指针,并且如果块被填充,则新的块被分配并且被添加到链表。当arena被解除分配时,下一空闲位置指针被重置到第一个块的开头,并且块链表可以被重新用于待创建的下一arena。此外,当区域被解除分配时,块链表可以被附加到全局空闲链表,其他arena稍后可以从中分配新块。许多操作可以被执行来构造链表,单个操作可以在不必遍历链表的情况下将arena解除分配。分配和解除分配的操作可以利用供程序员使用的库中的简单函数来实现。基于arena的存储器管理系统包括将分配的对象指派给arena并且以这种方式立即从arena中将对象解除分配的特征和机制。
运行时系统204可以在存储器104中为arena分配存储器段来用于存储和管理对象。在一个示例中,存储器段是堆。(本公开中的“堆”与操作系统中的原生堆不同。)在一个示例中,每个进程都可以有堆,并且进程中的线程为同一堆上的对象分配存储器。在另一示例中,堆可以是大对象堆(诸如包括大小超过选定阈值的对象的堆)和小对象堆的累积。堆可以包括任意数量的不连续的虚拟存储器体块(chunk),每个虚拟存储器体块包括具有对象的活动块,这些对象散布在空闲存储器区域或空闲空间区域。运行时系统204可以维护索引已分配的所有空闲存储器的空闲链表数据结构或物理空闲链表。
运行时系统204可以包括垃圾收集器208,以自动管理软件应用的堆或托管堆上的存储器的分配和释放。垃圾收集器208尝试检测计算机系统上的软件应用不再使用的对象,并恢复运行在计算系统上的软件应用不再使用的对象所占用的存储器。在一个示例中,垃圾收集器208可以提供跟踪垃圾收集,以通过跟踪哪些对象可以被来自某些根对象的引用链访问并收集其余对象,而不是通过引用计数来确定哪些对象应被解除分配。垃圾收集器208包括优化引擎212来确定执行收集的优选时间或时机。垃圾收集器208检查存储器段中不再被应用使用的对象,并执行操作来回收存储器。垃圾收集可以响应于与堆相关的参数(诸如系统何时物理存储器不足或者存储器段上分配的对象使用的存储器是否超过可接受的阈值)而发生。
在一个示例中,堆可以是分代堆(generational heap)。堆可以被组织为多个代来处理长期和短期的对象。垃圾收集主要在回收通常占用堆的小部分的短期对象时发生。一个示例包括堆上的三代对象,包括第0代、第1代和第2代。第0代是最年轻的一代,并且包含诸如临时变量的短期对象。垃圾收集在这一代发生得最频繁。在一个示例中,除非它们是大对象(在这种情况下,它们会前往第2代收集中的大对象堆之上),否则新分配的对象形成了新一代对象,并且隐含地是第0代集合。针对垃圾收集,许多对象在第0代被回收,并且不会存活到下一代。第1代包括短期对象,并且可以作为短期对象和长期对象之间的缓冲区。一些示例垃圾收集器不包括第1代堆,并且仅包括用于短期和长期对象的堆。附加地,一个或多个代的短期对象可以被称为短生代(ephemeral generation)。第2代包括长期对象。长期对象的一个示例是服务器应用中的对象,其包含在进程持续期间内有效的静态数据。当条件允许时,垃圾收集发生在特定代。收集代意味着收集该代及其所有年轻一代中的对象。第2代垃圾收集通常是完全垃圾收集,因为它回收所有代托管堆中的所有对象。没有在垃圾收集中回收的对象被称为幸存者,并且可以被提升到下一代。例如,在第0代垃圾收集中幸存的对象被提升到第1代,在第1代垃圾收集中幸存的对象被提升到第2代,而在第2代垃圾收集中幸存的对象保留在第2代。
在垃圾收集开始或被触发之前,除了触发垃圾收集的线程之外的托管线程可以被挂起。垃圾收集器208可以通过诸如由即时编译器和堆栈步行器提供的堆栈变量、指向托管对象并且可以由用户代码或运行时分配的句柄的信息,并且根据可能正在引用其他对象的应用域中的静态对象来确定对象是否存活。每个应用域跟踪其静态对象。在一个示例中,垃圾收集可以发生在一组阶段中,这些阶段包括查找和创建所有活动对象链表的标记阶段、更新对将被压缩的对象的引用的重定位阶段、以及回收被死去的对象占据的空间并压缩幸存对象的压缩阶段。压缩阶段将在垃圾收集中幸存的对象移向存储器段的较旧端。在一个示例中,垃圾收集器208可以是标记和清除收集器,收集器可以找到并创建所有活动对象的列表、更新对占用待被压缩的存储器的对象的引用、回收被死去的对象占用的地址空间、以及压缩幸存对象。
图3图示了与基于arena的存储器管理系统(诸如支持使用arena来进行存储器管理并具有垃圾收集器208的框架200)一起使用的示例方法300。在该示例中,arena在与垃圾收集服务的堆分离的存储器段(诸如存储器104)中被创建。响应于用于回收存储在分配在arena中的多个对象的存储器的调用,在302处,arena中的不使用的对象被收集。在一个示例中,回收存储器的调用被延迟,直到arena的清理基于选定指标而被触发。这可能与典型的arena收集形成对比,后者直接响应于调用而回收存储器。选定的一个或多个指标可以包括典型的垃圾收集触发器。然而,在方法300的情况下,直到在用于回收arena的存储器的调用之后才发生arena的清理。这可以与典型的垃圾收集形成对比,后者可以在程序化的存储器解除分配之前发生。可以使用针对arena的清理例程或清理任务来摧毁arena。
此外,响应于用于回收存储器的调用,在304处,多个对象中的活动对象通过将该活动对象复制到堆来保留。在该示例中,堆是具有垃圾收集的服务。在一个示例中,垃圾收集是跟踪垃圾收集并检测已设置为将释放的活动对象。在一个示例中,回收存储器的调用可以将活动对象重新定位到arena之外,诸如在arena被解除分配之前在托管堆的一部分中。arena的典型实现方式是不安全的,因为即使其他arena具有指向arena中待删除的对象的可访问指针,arena也可以被删除。不同于应用引用计数器来防止arena被删除,而是活动对象被重新定位并且arena被删除。指向从arena重定位到堆的活动对象的指针被更新。在一个示例中,在arena不再包括活动对象或指向arena的指针之后,arena可以被删除。因此,方法300在调用回收存储器之后在程序中的有效点处删除arena(这可能发生在调用回收存储器之后),并且保留堆中可能不经意地留在将被删除的arena中的活动对象。重定位到堆的活动对象可以在不使用之后被垃圾收集。被回收的arena所使用的存储器部分可以被用于其他arena。
在一个示例中,框架200可以通过将分离的存储器段用于垃圾收集和基于arena的托管对象来允许垃圾收集和基于arena的存储器管理在同一应用中共存。类库202可以提供函数和语句,以在具有公共生命期的对象处寻址的程序中实现基于arena的存储器管理。在一个示例中,类库202可以包括将存储器分配到arena以及在arena中分配对象的函数。
在一个示例中,arena可以在程序中使用如下语句来创建:
Arena abc=new Arena()
对象(诸如具有公共生命期的对象)可以随后被分配给该Arena。在程序的某个部分,当Arena中的许多(如果不是全部)对象不再被使用时,即,公共生命期到期,arena可以使用如下语句中的Dispose方法在程序中被收集,诸如
abc.Dispose()
运行时系统204将确定被分配在Arena中的哪些对象(如果存在的话)还存活或在使用中,并且将这些对象复制到垃圾收集堆中。在一个示例中,运行时系统204可以等待,直到合适的时间将幸存对象复制到堆。类库202还可以提供机制来对程序的一部分进行分组,以使用如下语句为程序中具有公共生命期的对象创建和收集Arena:
using(Arena abc=new Arena())
{
//…使用arena abc对语句进行编程
}
将分配定向到Arena可以被称为“激活Arena”,Activate函数可以使用如下语句使得线程在Arena中进行分配:
ArenaThread xyz=abc.Activate()
Activate函数返回ArenaThread对象。分配可以通过调用ArenaThread对象上的Dispose函数而被定向回堆,诸如:
xyz.Dispose()
类库还可以提供机制来将这两种运算与using语句组合,诸如:
using(abc.Activate())
{
//…这里分配前往Arena abc
}
示例实现方式可以包括与每个执行线程附接的分配器栈。为响应Activate函数的执行,与Arena相关联的分配器被推送到分配器栈上。响应于使用Dispose函数设置的ArenaThread对象,相关联的分配器从分配器栈中弹出。对于对象分配,栈上最顶层的分配器提供存储器。被分配在同一Arena中的多个线程的使用是可以预期的,并且可以在多个线程协作来为请求提供服务的服务器环境的场景中使用。
框架200可以包括对异步编程的支持,其中任务可以由第一线程启动,在等待时被搁置,然后在第二线程中继续。在任务与Arena相关联的情况下,第一线程和第二线程被分配在同一Arena中。框架200包括将任务的线程自动分配到同一Arena中的规定。
分配以某种方式被定向到Arena,该方式暗示由使用Arena的逻辑调用的其他代码或arena-aware逻辑将在Arena中分配存储器,而无需修改或重新编译。在该配置中,现有代码可以被用于修改,以与arena-aware逻辑一起使用。在不希望现有代码与Arena一起工作的情况下,诸如已知分配与任何Arena无关的某些库例程,垃圾收集堆可以使用以下语句来激活:
using(Arena.GCHeap.Activate())
{
//…这里分配前往堆,而不是Arena
}
引用计数方案可以被实现来解决Arena被设置但仍在用于分配的情况。在引用计数方案的一个示例中,Arenas利用引用计数x(诸如1)来创建。对于每个实例,arena的分配器被推送到线程的分配器栈上,arena的引用计数增加。在Arena上调用Dispose函数会减少引用计数。此外,在ArenaThread对象上调用Dispose函数会弹出当前线程上的分配器栈并减少与分配器相关联的Arena的引用计数。如果Arena上的引用计数下降到x-1,或者在示例中为0,则Arena变为可收集的,即,系统将在未来的某个时刻复制出所有活动对象或仍然可以访问的对象,然后摧毁arena。
在一个示例中,框架200可以不限制指向Arena中的对象的指针可以被存储的位置。因此,指向Arenas中对象的指针可能会在局部变量中、同一Arena中的对象中、不同Arena中或堆中遇到。同样,Arena中的对象可以自由地指向常规垃圾收集对象或不同Arena中的对象。为了确定可收集Arena中的哪些对象仍然可以访问并因此要保留,线程栈及其关联的局部变量以及堆对象可以被检查。为了简单地进行该检查,运行时系统202可以记录在不同Arena之间或Arena与堆之间创建引用的情况。在一个示例中,从堆到Arenas的引用设置了堆已使用的卡表中的字节,以跟踪跨代指针,并且引用也在每线程引用列表中被记录。如果引用是短生垃圾收集存储器,即,垃圾收集代0或1,则从Arenas到堆的引用在侧表中设置了一个位。此外,Arenas之间的引用也在侧表中设置了一个位,并在每个线程参考链表中被记录。
当Arena变得可收集时,诸如当Arena上的引用计数下降到x-1或在引用计数示例中为0时,运行时系统202将Arena的仍可访问的对象复制到堆,并且将由垃圾收集器208来服务。运行时系统202可以包括Arena收集和具有垃圾收集的Arena收集。在Arena收集中,可收集arena中的活动对象或对象可访问对象被复制到堆。在一个示例中,除非堆中的对象具有指向可收集Arena中的对象的指针,否则不考虑收集堆中的对象。Arena收集相对较快,但可能相对保守,因为堆中不可访问的对象可能包含指向Arena中对象的指针。Arena中的对象将被认为是可访问的,即使它只能通过本身不可访问的对象来访问。这可能会导致Arena中无法访问的对象存活。具有垃圾收集的Arena收集允许运行时系统202以相对更高的精度计算可访问性,但是具有垃圾收集的Arena收集比Arena收集相对更昂贵。
在一个示例中,运行时系统202可以自动确定是应用Arena收集还是应用具有垃圾收集的Arena收集。例如,运行时系统202可以评估并基于包括在堆上使用的存储器量和在引用链表中使用的量的指标来确定。程序可以通过调用GC.Collect()函数来触发垃圾收集,并且在一个示例中,函数可以使得具有垃圾收集的Arena收集发生。
可以根据如下指标来确定在Arena收集期间对Arenas中的对象的引用,指标包括用户程序中的局部变量、在创建从堆到Arena或不同Arenas之间的引用时构建的引用链表、可收集的Arenas中的可终结对象和垃圾收集句柄。可以确定所指向的对象是否在可收集arena中。如果所指向的对象在可收集Arena中,则对象被复制到堆并由垃圾收集器208来服务。对该对象的引用(如果存在)可以被更新为指向新的位置。
确定所指向的对象是否在可收集arena中可以包括确定指针是否指向为arena保留的存储器范围。如果指针指向为Arenas保留的存储器范围,则计算Arena存储器中包含的块编号。在一个示例中,Arena存储器被细分为1MB(1MiB)块,并且确定块编号包括减去Arena存储器范围的基地址并将所得到的偏移量除以220,或者1MiB。块编号被用于索引查找表,查找表包含用于标识每个块所包含的Arena的编号。可以确定包含Arena的实际引用计数是否为0。
从复制对象被引用的对象可以在可收集的Arena中,也可以被复制到堆中。这包括从复制对象引用的对象引用的对象等。
在包括服务器环境的场景中,若干执行线程可以协同执行清理任务,并且运行时系统202可以提供锁定方案和清理线程之间的工作协调。锁定方案可以帮助确保给定的Arena对象将被一个清理线程复制,并且清理线程将看到该对象的一致的新位置。这也确保了如果存在对象的多个引用,它们都将被更新到同一新位置。作为一个特殊情况,若干线程可能会同时尝试更新同一引用,这是可以接受的,因为所有线程均写入相同的值。清理线程之间的工作协调可以使得所有清理线程保持忙碌,从而将清理任务的时间最小化或减少。可以通过跨多个清理线程有效地枚举共享数据结构(Arena、Arena块、引用链表)来执行工作协调。由于清理过程是多阶段过程,工作协调有助于防止线程在所有线程完成当前阶段之前进入下一阶段。例如,在摧毁Arena之前,我们需要确保所有清理线程确实已完成从其中撤离出对象。
虽然本文中已图示和描述了特定实施例,但是本领域的普通技术人员将理解,在不脱离本发明的范围的情况下,可以使用各种替代和/或等效的实现来代替所示和描述的特定实施例。本申请旨在涵盖本文中讨论的特定实施例的任何修改或变化。
Claims (10)
1.一种控制基于arena的存储器管理系统的方法,所述方法包括:
响应于用于回收存储被分配在arena中的多个对象的存储器的调用,收集所述多个对象中的在所述arena中不使用的对象;以及
将所述多个对象中的活动对象从所述arena复制到堆。
2.根据权利要求1所述的方法,包括响应于所述调用而销毁所述arena。
3.根据权利要求1所述的方法,其中所述堆由垃圾收集来服务。
4.根据权利要求1所述的方法,其中复制活动对象还包括复制从所述活动对象引用的对象。
5.根据权利要求1所述的方法,包括如果所述arena正被用于分配,则使用引用计数。
6.一种基于arena的存储器管理系统,包括:
存储器设备,用于存储一组指令;以及
处理器,用于执行所述一组指令,以用于:
响应于用于回收存储被分配在arena中的多个对象的存储器的调用,收集所述多个对象中的在所述arena中不使用的对象;以及
将所述多个对象中的活动对象从所述arena复制到由垃圾收集器服务的堆。
7.根据权利要求6所述的系统,其中响应于用于回收存储器的所述调用,所述堆中具有指向在所述arena中不使用的对象的指针的对象被收集。
8.根据权利要求6所述的系统,其中多个线程在所述arena中分配。
9.一种计算机可读设备,用于存储计算机可读指令,所述计算机可读指令用于控制处理器来控制基于arena的存储器,所述指令包括:
响应于用于回收存储被分配在arena中的多个对象的存储器的调用,收集所述多个对象中的在所述arena中不使用的对象;以及
将所述多个对象中的活动对象从所述arena复制到由垃圾收集服务的堆。
10.根据权利要求9所述的计算机可读设备,包括用于回收存储器的销毁方法的指令。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/447,790 | 2019-06-20 | ||
US16/447,790 US11416392B2 (en) | 2019-06-20 | 2019-06-20 | Arena-based memory management |
PCT/US2020/031397 WO2020256842A1 (en) | 2019-06-20 | 2020-05-05 | Arena-based memory management |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114051610A true CN114051610A (zh) | 2022-02-15 |
Family
ID=70861546
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080042235.0A Pending CN114051610A (zh) | 2019-06-20 | 2020-05-05 | 基于arena的存储器管理 |
Country Status (4)
Country | Link |
---|---|
US (1) | US11416392B2 (zh) |
EP (1) | EP3987402A1 (zh) |
CN (1) | CN114051610A (zh) |
WO (1) | WO2020256842A1 (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11513951B2 (en) * | 2019-07-31 | 2022-11-29 | EMC IP Holding Company, LLC | System and method for improving write performance for log structured storage systems |
US11954023B2 (en) | 2022-07-20 | 2024-04-09 | Microsoft Technology Licensing, Llc | Garbage collection prefetching state machine |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU2158900A (en) | 1998-11-25 | 2000-06-19 | Sun Microsystems, Inc. | A method for enabling comprehensive profiling of garbage-collected memory systems |
US6799191B2 (en) | 2000-05-16 | 2004-09-28 | Sun Microsystems, Inc. | Object sampling technique for runtime observations of representative instances thereof |
US7263532B2 (en) * | 2003-09-23 | 2007-08-28 | Microsoft Corporation | Region-based memory management for object-oriented programs |
US8949295B2 (en) * | 2006-09-21 | 2015-02-03 | Vmware, Inc. | Cooperative memory resource management via application-level balloon |
US7937419B2 (en) | 2008-06-26 | 2011-05-03 | Tatu Ylonen Oy | Garbage collection via multiobjects |
US8250121B2 (en) | 2009-11-18 | 2012-08-21 | Oracle America, Inc. | Zero-copy maturing of large objects in generational heap with copying collection |
US8423589B2 (en) | 2011-03-14 | 2013-04-16 | International Business Machines Corporation | Copy collector with efficient abort-on-copy transition to mark collector |
US9128949B2 (en) * | 2012-01-18 | 2015-09-08 | Cloudera, Inc. | Memory allocation buffer for reduction of heap fragmentation |
US8694562B2 (en) * | 2012-05-22 | 2014-04-08 | Microsoft Corporation | Generational garbage collection for a pool-based heap |
US20150227414A1 (en) | 2012-08-31 | 2015-08-13 | Pradeep Varma | Systems And Methods Of Memory And Access Management |
JP5889270B2 (ja) * | 2013-12-13 | 2016-03-22 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | スタック・スキャンのコストを削減するための方法、プログラム及びシステム |
WO2015192045A2 (en) * | 2014-06-13 | 2015-12-17 | Pivotal Software, Inc. | Precisely tracking memory usage in multi-process computing environment |
US10725963B2 (en) * | 2015-09-12 | 2020-07-28 | Microsoft Technology Licensing, Llc | Distributed lock-free RDMA-based memory allocation and de-allocation |
US10375167B2 (en) * | 2015-11-20 | 2019-08-06 | Microsoft Technology Licensing, Llc | Low latency RDMA-based distributed storage |
US10459849B1 (en) * | 2018-08-31 | 2019-10-29 | Sas Institute Inc. | Scheduling operations in an access-controlled region of memory |
-
2019
- 2019-06-20 US US16/447,790 patent/US11416392B2/en active Active
-
2020
- 2020-05-05 CN CN202080042235.0A patent/CN114051610A/zh active Pending
- 2020-05-05 EP EP20728850.7A patent/EP3987402A1/en active Pending
- 2020-05-05 WO PCT/US2020/031397 patent/WO2020256842A1/en active Application Filing
Also Published As
Publication number | Publication date |
---|---|
US20200401517A1 (en) | 2020-12-24 |
WO2020256842A1 (en) | 2020-12-24 |
EP3987402A1 (en) | 2022-04-27 |
US11416392B2 (en) | 2022-08-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4511653B2 (ja) | マルチスレッド仮想マシン内におけるメモリ・アロケーションの方法及び装置 | |
Flood et al. | Parallel garbage collection for shared memory multiprocessors | |
US8539452B2 (en) | Virtual machine tool interface for tracking objects | |
US7469324B2 (en) | System and method for concurrent compacting self pacing garbage collection using loaded value and access barriers | |
US7412580B1 (en) | Concurrent incremental garbage collector with a card table summarizing modified reference locations | |
EP3577565B1 (en) | Garbage collector | |
US7870171B2 (en) | Method and system for garbage collection in a multitasking environment | |
US7620943B1 (en) | Using class properties to segregate objects in a generation managed by the train algorithm | |
US20040186863A1 (en) | Elision of write barriers for stores whose values are in close proximity | |
US8447793B2 (en) | Efficient remembered set for region-based garbage collectors | |
CN114051610A (zh) | 基于arena的存储器管理 | |
US7565497B1 (en) | Coarse write barrier control mechanism | |
US7676801B1 (en) | Scanning of evacuated objects in a generation managed by the train algorithm | |
JP2006172495A (ja) | プログラム制御装置、プログラム制御方法、およびプログラム記録媒体 | |
US20090228537A1 (en) | Object Allocation System and Method | |
US7058781B2 (en) | Parallel card table scanning and updating | |
US7653793B1 (en) | Use of memory protection to implement replicating collection in an incremental, copying garbage collector | |
US11650916B2 (en) | Closed loop garbage collector | |
US20040172507A1 (en) | Better placement of objects promoted into a generation managed by the train algorithm | |
JP4345748B2 (ja) | メモリ割当装置、メモリ割当方法、およびプログラム記録媒体 | |
US11188460B2 (en) | Arena-based memory management | |
CN109923527B (zh) | 可变类型建立器 | |
Spoonhower et al. | Using page residency to balance tradeoffs in tracing garbage collection | |
US20080034022A1 (en) | System and method for updating references when incrementally compacting a heap | |
US7272695B1 (en) | Hot-card caching to avoid excessive remembered-set updating |
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 |