CN1829977A - 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 - Google Patents

利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 Download PDF

Info

Publication number
CN1829977A
CN1829977A CN200480022183.1A CN200480022183A CN1829977A CN 1829977 A CN1829977 A CN 1829977A CN 200480022183 A CN200480022183 A CN 200480022183A CN 1829977 A CN1829977 A CN 1829977A
Authority
CN
China
Prior art keywords
stack
trace
frame
enumerated
stack trace
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
CN200480022183.1A
Other languages
English (en)
Other versions
CN1829977B (zh
Inventor
G·吴
G·-Y·吕
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.)
Intel Corp
Original Assignee
Intel Corp
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 Intel Corp filed Critical Intel Corp
Publication of CN1829977A publication Critical patent/CN1829977A/zh
Application granted granted Critical
Publication of CN1829977B publication Critical patent/CN1829977B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99941Database schema or data structure
    • Y10S707/99944Object-oriented database structure
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99951File or database maintenance
    • Y10S707/99956File allocation
    • Y10S707/99957Garbage 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)
  • Memory System Of A Hierarchy Structure (AREA)
  • Debugging And Monitoring (AREA)

Abstract

提供一种装置,用于在垃圾收集时利用一个栈跟踪高速缓存器执行一个线程的栈中的根集枚举。在栈的第一根集枚举过程中,全栈展开可能被执行,并且一个栈跟踪高速缓存器可能被建立,以缓存与栈帧有关的栈跟踪信息。栈中的根集枚举的接下来的会话可以访问和复制部分或者全部被缓存的栈跟踪信息,而不用执行全栈展开。

Description

利用一个栈跟踪高速缓存器 改善垃圾收集的性能的方法和装置
版权保留
本专利文献的公开的一部分包含受版权保护的素材。版权所有者对任何人复制再现专利文献或者专利公开没有异议,如在专利和商标局的专利文献或者记录中出现的那样,但是另外保留所有任何版权。
背景
1.领域
本发明通常涉及垃圾收集,并且尤其涉及垃圾收集过程中的根集枚举。
2.说明
垃圾收集、即计算机存储器的自动回收的功能是找到不再被使用的数据对象,并且使其空间可用于运行程序的再利用。垃圾收集对于避免不必要的复杂化和由显式存储分配所产生的微妙的交互作用是重要的,以减少程序调试的复杂性,并且因此提高全模块化程序设计和增加软件应用可移植性。因为它的重要性,垃圾收集正成为管理运行时环境的主要部分。
垃圾收集的基本机能可能包括三个阶段。在第一阶段中,对来自所有线程的当前运行程序的对象的所有直接引用(reference)可以被识别。这些引用被称为根,或者一起被称为根集,识别所有这些引用的过程可以被称为根集枚举。在第二阶段中,由于这些对象将来可被使用,因此所有从根集中可达的对象可被搜索。从根集中的任何引用可达的对象被认为是活动对象;否则,它被认为是垃圾对象。从活动对象可达的对象也是活动的。找到所有从根集可达的活动对象的过程可被称为活动对象跟踪(或者标记或者扫描)。在第三阶段中,垃圾对象的存储空间可以被回收(垃圾回收)。这个阶段可以由垃圾收集器或者运行应用程序(通常被称为赋值函数(mutator))实施。实际上,这三个阶段、尤其后两个阶段可以在功能上或者时间上相互交错,并且回收技术可能强烈地依赖于活动对象跟踪技术。根据根集枚举发生在什么地方,根集枚举也可以被称为寄存器根集枚举(下文中为寄存器枚举)、堆根集枚举(下文为堆枚举)、或者栈根集枚举(下文为栈枚举)。与栈枚举相比,由其他存储区域中的根集枚举所引起的开销在典型应用中通常小,并且可以被忽略。
当空闲存储空间运行到低于一个极限时,垃圾收集可被调用,并且所有线程可被中断,因此每个线程的根集枚举可被启动(对于同时发生的垃圾收集,一些线程可能不被中断,以便调用根集枚举)。对于一个线程的栈枚举,线程被中断处的栈帧(在线程的栈中)成为当前帧,而栈枚举可能从所述当前帧开始。当前帧中的所有活引用可被识别并且被枚举。在当前帧被枚举之后,调用栈中的下一栈帧(也即调用者的帧)成为当前帧,在该当前帧中所有活引用可被识别。被称为栈展开(stack unwinding)的该过程一直持续,直到调用链中的所有帧都被走完和被枚举。
在垃圾收集器的栈枚举中所涉及的栈展开机构每次一个帧地展开调用栈的栈帧或者沿调用栈的栈帧移动,以识别当前有效的引用、即形成根集的引用。对于某些应用程序、尤其对于具有大量线程和每个线程有一个深调用链的那些应用程序,栈展开招致用于垃圾收集的巨大的运行时开销。具有越多的线程和每个线程的调用链越深,可被使用的运行时开销越高。因此,期望通过减少由栈展开招致的开销来提高栈枚举的效率。
附图简述
从下面的本发明详述中来明显得出本发明的特征和优点。
图1描述了根据本发明实施例的管理运行时系统的高级结构,所述管理运行时系统使用至少一个栈跟踪高速缓存器来提高垃圾收集的性能;
图2是根据本发明实施例的高级过程的示例性流程图,其中在管理运行时系统中,栈跟踪高速缓存器在用于垃圾收集的根集枚举时被使用;
图3是根据本发明实施例的栈枚举机构的高级功能框图,该栈枚举机构使用一个栈跟踪高速缓存器;
图4是根据本发明实施例的一个过程的示例性流程图,其中栈跟踪高速缓存器被建立,并且被用于改善在用于一个线程的垃圾收集时根集枚举的性能;和
图5(a)-(d)是根据本发明实施例的在用于一个线程的栈枚举的不同会话时栈跟踪高速缓存器的状态的图解说明。
详述
本发明的一个实施例是用于利用至少一个栈跟踪高速缓存器来改善用于垃圾收集的根集枚举的性能的方法和装置。本发明可被用于:在具有大量线程和每个线程有一个深调用链的软件应用程序中,在不用大量成本的情况下减少在垃圾收集时栈枚举的开销。在很多软件应用程序中,一个线程中的功能调用链可以是重复的,即调用者和被调用者关系从一个垃圾收集会话到下一垃圾收集会话可能变化不是很大。这种特征可以导致两个连续垃圾收集会话的类似或者部分类似的栈跟踪。因此,栈跟踪高速缓存器可被用于该线程,以存储栈跟踪信息,所述栈跟踪信息反映了在调用链中的调用者-被调用者关系。该栈跟踪信息可以包括栈帧列表、与每个帧相关联的上下文信息、当前指令指针(IP)、和/或源行号信息。在第一栈枚举(垃圾收集的第一会话)中,全栈展开可被执行并且栈跟踪高速缓存器可被建立,以存储栈中每个帧的跟踪信息。在第二或者以后栈枚举(垃圾收集的第二或者以后会话)中,可以通过简单地从栈跟踪高速缓存器中检索栈跟踪信息的重复部分来避免包含在全栈展开中的部分或者全部工作。也在第二或者以后栈枚举中,栈跟踪高速缓存器可被修改,以容纳新的栈和/或更新旧的栈。
在说明书中对本发明“一个实施例”或“实施例”的引用表示:结合该实施例所描述的特定特性、结构或者特征包含在本发明的至少一个实施例中。因此,贯穿本说明书在不同地方出现短语“在一个实施例中”不一定都表示同一实施例。
图1描述了根据本发明实施例的管理运行时系统的高级结构,所述管理运行时系统使用至少一个栈跟踪高速缓存器来改善垃圾收集的性能。该管理运行时系统100可能包括一个核心虚拟机(VM)110、至少一个即时(JIT)编译器120、一个根集枚举机构130、至少一个栈跟踪高速缓存器140、和一个垃圾收集器150。核心VM 110是在硬件平台和操作系统上以软件形式实现的抽象计算机。VM的应用使得软件程序独立于不同的硬件和操作系统。VM可被称为用于Java程序的Java虚拟机(JVM),也可被称为其他名称、例如用于C#程序的通用语言基础结构(CLI)。为了使用VM,程序必须首先被编译为结构中立的分布格式(architecture-neutral distribution format)、也即诸如Java代码的字节码等中间语言。VM解释该中间语言并且在特定计算平台上执行该代码。然而,由于巨大的运行时开销处理,VM的解释典型地给字节码的执行强加了一种无法接受的性能代价。JIT编译器已被设计,以改善VM的性能。在一给定方法第一次被调用之前,该JIT编译器120将该给定方法的中间语言编译成基础机(underlyingmachine)的本地码。该方法的本地码被存储在存储器中,并且以后对该方法的任意调用将由该更快的本地码处理,而不是由VM解释处理。
根集枚举机构130可以识别栈、寄存器、和其他存储区域中的初始活引用(根)。该根集枚举机构可以是核心VM 110的一部分、垃圾收集器的一部分、核心VM和垃圾收集器两者的一部分、或者与核心VM或者垃圾收集器分离开。根集枚举机构可以包括用于识别栈中的活引用的栈枚举机构135、用于识别寄存器中的活引用的寄存器枚举组件、和用于识别在其他存储区域中的活引用的其他组件。由于栈枚举可能招致比寄存器和其他区域中的枚举更多的开销,所以栈跟踪高速缓存器140可以被用于减少用于一个线程的栈枚举开销。栈跟踪高速缓存器可能包括存储器的存储空间。在一个实施例中,该栈跟踪高速缓存器可以利用诸如链表等动态的、可伸缩的数据结构来实现。
栈枚举机构135可以使用一个栈跟踪高速缓存器来存储一个线程的栈跟踪信息。该栈跟踪信息可能包括栈帧列表、与每个帧相关联的上下文信息、当前指令指针(IP)、和/或源行号信息。在第一栈枚举(针对第一垃圾收集会话)过程中,栈枚举机构可以建立一个栈跟踪高速缓存器,并且把栈跟踪消息缓存在该栈跟踪高速缓存器中,同时栈枚举机构走完、并且枚举一个栈中的每个帧,即展开整个栈。在第二或者以后的栈枚举(针对第二或者以后的垃圾收集会话)过程中,栈枚举机构可以首先开始走完该栈中的每个帧。对于一个帧,栈枚举机构可以检测从该帧开始的跟踪信息是否被缓存在栈跟踪高速缓存器中。如果从该帧开始的跟踪信息被缓存,那么可能表示该栈枚举机构能够直接使用跟踪信息,而不用进一步展开栈。另一方面,如果从该帧开始的跟踪信息没有被缓存,或者自最后的栈枚举以后就已经变化,那么栈枚举机构可以修改栈跟踪高速缓存器,以缓存新的或者被更新的跟踪信息。在第二或者以后的栈枚举之后,栈枚举机构可以更新栈跟踪高速缓存器中的栈跟踪信息。
垃圾收集器150可以包括一个活动对象跟踪机构152,和一个垃圾回收机构154。该活动对象跟踪机构152可以搜索存储空间,以找到从根集可达的所有对象。由于这些对象在将来可被使用,所以这些对象被认为是活动对象。活动对象跟踪机构可以把这些对象标记为活动对象,并且进一步扫描,以找到这些对象可达的任意其它活动对象。不同于活动对象的对象被认为是垃圾对象,其存储空间可由垃圾回收机构154回收。实际上,活动对象跟踪机构和垃圾回收机构在功能上可以相互交错,并且回收技术可能强烈地依赖于活动对象标记技术。垃圾回收机构可以在把活动对象移动或者不移动到存储空间一端的暂时区域的情况下回收垃圾对象的空间。在一实施例中,垃圾回收机构可以是赋值函数的一部分,而不是垃圾收集器的一部分。
图2是根据本发明一个实施例的高级过程的一个示例性流程图,其中在管理运行时系统中的垃圾收集的根集枚举时使用一个栈跟踪高速缓存器。在块210处,可以开始垃圾收集会话。在块220处,可以使用栈跟踪高速缓存器来执行栈枚举。当全栈展开被执行时,一个栈跟踪高速缓存器可以在线程的第一栈枚举过程中被建立,以缓存栈跟踪信息。如果自从最后栈枚举会话以来没有发生变化,那么在线程的栈枚举的以后会话过程中,在不实施全栈展开的情况下可以检索一部分或者所有被缓存的栈跟踪信息。对于那些其跟踪信息已经变化的帧,栈展开可被执行,并且栈跟踪高速缓存器可被修改,以容纳被更新的栈跟踪信息。在块230处,可以执行其他存储区域中的根集枚举,以找到诸如寄存器的其他存储区域中的活引用。可同时执行、或者在不影响本发明精神的情况下以相反的顺序执行块220和230。在块240处,在栈枚举和其他存储区域中的根集枚举时所获得的活引用可以被集合在一起,以形成根集。在块250处,存储空间可被搜索,以标记和扫描从根集中的引用可达的所有活动对象。在块260处,存储空间中的所有那些没有被标记的对象可被认为是垃圾,其空间可被回收。
图3是按照本发明一个实施例的栈枚举机构的高级功能框图,所述栈枚举机构使用一个栈跟踪高速缓存器。该栈枚举机构135可以包括栈帧分类器310、跟踪信息缓存机构320、栈展开机构330、未改变的跟踪检测机构340、和未改变的跟踪检索机构350。栈帧分类器310可以使用栈370中的一个栈帧的“in-cache(在缓存中)”标签的值,以判决栈帧是被重新产生(即未被缓存)还是已经位于一个栈跟踪高速缓存器140中(即被缓存)。当调用被启动时,该“in-cache”标签可由编译器设置。当与该调用相关联的栈帧第一次被产生时,编译器可以设置该“in-cache”标签的值为假。当栈帧分类器把栈帧分类为“未被缓存”时,栈展开机构330可以为该帧执行正常的栈展开(即枚举在该帧中的引用,并且跳转到下一帧),并且把活引用保存在根集360中。随后,跟踪信息缓存机构320可以把该帧的跟踪信息缓存到栈跟踪高速缓存器中,并且把栈帧的“in-cache”标签的值从假改为真,即栈帧变成被缓存。该跟踪信息缓存机构可以包括一个高速缓存器建立器325,其在栈枚举第一次被实施时建立一个栈跟踪高速缓存器。在第二或者以后的栈枚举对话中,高速缓存器建立器可以改变栈跟踪高速缓存器,以容纳新产生的和/或被更新的栈帧。栈跟踪高速缓存器可以包括两个区域:存储栈帧的标识符的识别区和存储每个栈帧中所枚举的活引用的列表区。在一个实施例中,被缓存的栈跟踪信息可以由以下数据结构来表示:
  struct CachedStackFrame{
         <eip,esp>id;/*eip和esp分别表示IP和SP*/
         Ref_List ref_list;/*为该帧所缓存的枚举引用*/
  }cache[MAX_CALL_DEPTH];
其中cache[MAX_CALL_DEPTH]数组是线程本地对象,也即每个线程具有其自身的栈跟踪高速缓存器。
跟踪信息缓存机构320也可以包括一个识别组件,以用一对寄存器(即指令指针寄存器(IP)和栈指针寄存器(SP))的值识别栈跟踪高速缓存器中的每个栈帧。IP也可以被称为程序计数器(PC),并且可以足以指出栈帧的源位置和方法名称。SP指向当前栈位置。由于可能存在对在具有相同IP的栈上的同一方法的多个调用(具有不同的栈位置)(例如递归调用),所以IP独自可能不能够识别栈帧,而SP可以区分与这些调用有关的帧。因此,使用<IP,SP>可能对于唯一识别栈帧是适当的。
当栈帧分类器310把栈370中的栈帧分类成“被缓存”在第二或者以后的栈枚举中时,未改变的跟踪检测机构340可以从顶部到底部搜索栈跟踪高速缓存器,并且检测栈跟踪的未改变部分的起始帧。当栈跟踪高速缓存器中的帧的<IP,SP>的值被认为等于当前帧的<IP,SP>的值时,栈跟踪高速缓存器中的未改变部分的起始帧可以被检测。当未改变部分的起始帧在栈跟踪高速缓存器中被检测到时,未改变部分检索机构350可以把未改变部分的引用直接复制到根集360,而不用进一步展开该栈。
图4是按照本发明的一个实施例的一个过程的示例性流程图,其中栈跟踪高速缓存器被建立,并且被用于在线程的垃圾收集过程中改善根集枚举的性能。在块410处,可以开始栈枚举。在块415处,可以判决这个栈枚举是否为线程的第一栈枚举。如果这是线程的第一栈枚举,那么在从块425处开始为枚举估计栈中的一个帧之前,可以在块420处为该线程建立一个栈跟踪高速缓存器;否则,栈中的帧可以直接从块425处开始被(逐一)估计。在块425处,栈中的一个帧可被检测,以查看该帧是被附加标签“被缓存”还是被附加标签“未被缓存”。如果该帧被附加标签“未被缓存”,则可以在块430处实施标准的栈枚举,在该块430中可能开始栈展开,直到在该栈中到达一个“被缓存”的帧。在块435处,关于已经在块430处被枚举的帧的跟踪信息可以被缓存,并且这些帧可被附加标签“被缓存”。该跟踪信息可能包括每个帧的标识符和在每个帧中所枚举的活引用。帧的标识符可以包括IP和SP的值。在块440处,栈被检查,以查看是否存在剩下要被枚举的任意帧。如果存在,那么栈中的下一帧可以在块425处被估计,并且在块425和块455(不包括块455)之间的过程可被重复,直到没有帧留在栈中。如果在块425处,一个帧被认为“被缓存”,那么栈跟踪高速缓存器可以被搜索,以在块445处检测栈跟踪的未改变部分的起始点。一旦未改变部分的起始点已经被检测出,那么在块450处,在栈跟踪高速缓存器中紧接于起始点之后的帧中的引用可以复制到根集,而不用进一步展开该栈。在块455处,根据栈中的所有帧的引用可被获得。
把栈跟踪高速缓存器应用于栈枚举的优点可以通过比较标准栈枚举过程和利用一个栈跟踪高速缓存器的栈枚举过程来进一步描述。前者由伪码1说明,后者由伪码2说明。
                 2003INTEL CORPORATION1   Frame_Context context;2     Ref_List allref={};/*     栈枚举结果列表  */3     ......4     context.initialize_to_gc_suspend_point();5     while(not finished){6       normalize_if_necessary(&context);7       /*         执行标准栈枚举          */8       Ref_List rl=enumerate(&context);9       /*     把所枚举的引用复制到结果列表中   */10      allref.append(rl);11      finished=unwind_to next_frame(&context);12   }伪码1.标准栈枚举
在伪码1中,在第1行的“Frame_Context”表示调用帧的数据结构,并且包含诸如所保存的寄存器和溢出数据的信息。在一个线程的栈枚举开始之前,“上下文(context)”被初始化到一个帧,在该帧处线程通过第4行的“initialize_to_gc_suspend_point()”被中断。如果必要,第6行的“normalize_if_necessary()”从其中断位置到其基本位置标准化一个帧的SP。在该帧中的引用的枚举可以从标准化的SP位置开始。在该帧的枚举的结束时,“unwind_to_next_frame()”把栈展开到调用链中的一个调用者的帧,并且检索调用者的上下文。枚举过程继续,直到在调用链中的所有帧被枚举。换句话说,伪码1说明了全栈展开的过程。
                 2003 INTEL CORPORATION1   Frame_Context context;2   Ref_List allref={};/*    初始化栈枚举结果列表    */3   /*     暂时缓存以保存未在高速缓存器中的栈帧   */4   CachedStackFrame notcached[MAX_CALL_DEPTH];5   ......6   cortext.initialize_to_gc_suspend_point();7   while(not finished){8     if(context.In_cache==false){9      normalize_if_necessary(&context);10     /*  执行标准枚举             */11     Ref_List rl=enumerate(&context);12     /*  把所枚举的引用复制到结果列表中  */13     allref.append(rl);14     /*  把该帧的信息添加到暂时高速缓存器中  */15     add_to_cache(notcached,<context.eip,context.esp>,rl);16     finished=unwind_to_next_java_frame(&context);17   }else{18      /*  找到高速缓存器中的可再使用的跟踪的起始点  */19      fbr (j=top;j>=0;j--)20        if(context.<eip,esp>==cache[j].<eip,esp>)break;21      /*  把高速缓存器中的所杖举的引用复制到结果列表  */22      for(;j>=0;j--)23        allref.append(cache[j].ref_list);24      /*  停止展开,并跳出循环  */25      break;26    }27  }28  /*  更新具有暂时高速缓存器中的信息的高速缓存器  */29  update_cache(cache,notcached);伪码2.利用栈跟踪高速缓存器的栈枚举
伪码2通过利用一个栈跟踪高速缓存器(在18-25行示出)来增加避免部分或者所有栈展开的机会而区别于伪码1。因此,由利用一个栈跟踪高速缓存器的栈枚举所招致的开销可能小于通过全栈展开的栈枚举所招致的开销。
图5(a)-(d)是根据本发明一个实施例的在线程的栈枚举的不同会话中的栈跟踪高速缓存器的状态示意图。图5(a)图示说明了在栈枚举第一会话开始之前的栈。当栈枚举为一个线程第一次被调用时,栈中的所有帧被编译器附加标签“未被缓存”。因此,在第一栈枚举过程中,全栈展开被执行,在第一栈枚举之后,所有帧被附加标签“被缓存”,这是因为栈跟踪高速缓存器已经被建立,并且针对每个帧所枚举的引用都被缓存在该栈跟踪高速缓存器中,如图5(b)所示。在栈跟踪高速缓存器中的每个帧都具有一个识别(id)区,以存储帧id(即IP和SP的值),并且具有一个列表区,以存储针对每个帧所枚举的引用。图5(c)图示说明了在栈中的每个帧的状态和栈枚举的以后会话中的栈跟踪高速缓存器。当该栈枚举的以后会话被启动时,可能没有必要执行全栈展开,这是因为在栈中某些帧(例如在图5(c)中对应于方法T.main、A.a、B.b、和C.c的4个帧)保持不变,并且可以在不实施栈展开的情况下从栈跟踪高速缓存器中被直接检索。只有其他三个帧(即对应于方法G.g、H.h、和I.i的帧)未被缓存。因此,只需要部分栈展开(最多到对应于方法B.b的帧)。另外,栈跟踪高速缓存器可以被修改,以缓存关于在部分栈枚举过程中被枚举的帧的信息。图5(d)图示说明了栈的状态和在该栈枚举的以后会话之后的栈跟踪高速缓存器。
虽然本发明涉及在垃圾收集过程中为栈中的根集枚举使用栈跟踪高速缓存器,但是本领域普通技术人员将会容易地理解:本发明可被用于减少开销,该开销由包括诸如异常处理、调用者-被调用者关系检测等栈展开的任何过程所引起。另外,本发明可被用于诸如运行Java、C#、和/或任意其他编程语言的管理运行时环境等任何系统中的自动垃圾收集。
虽然本发明的一个实施例是参考图1-5(d)中的框图和流程图和伪码1-2来描述,但是本领域普通技术人员应该理解,执行本发明的许多其他方法也可以被有替代地使用。例如,流程图中的块和伪码中的步骤的执行顺序可被改变,和/或框图/流程图中的某些块和所描述的伪码中的某些步骤可被改变、去除、或者组合。
在上述说明中,已经描述了本发明的各个方面。为了解释的目的,提出了特定数字、系统和配置,以便彻底理解本发明。然而,受益于本公开的本领域技术人员明白,本发明在没有特别详述的情况下可以被实践。在其他情况下,众知的特点、部件、或者模块可以被省略、简化、组合或者分离,以便使本发明清楚。
本发明的实施例可以在任何计算平台上被实施,该计算平台包括硬件和操作系统。该硬件可以包括处理器、存储器、总线和到外围设备的I/O集线器。处理器可以运行编译器,以把任何软件编译成处理器专用指令。实施例所要求的处理可以由通用计算机独自、或者与专用计算机一起执行。这种处理可以由单平台或者由分布式处理平台来进行。另外,能够以专用硬件的形式或者以软件的形式实施这种处理和功能。
如果本发明实施例以软件来执行,那么该软件可以被存储在存储介质或者由通用或者专用可编程处理系统可读的设备(例如硬盘驱动器、软盘驱动器、只读存储器(ROM)、CD-ROM设备、闪存设备、数字万能光盘(DVD)、或者其他存储设备)中,用于当存储介质或者设备由处理系统读取以执行这里所述的程序时配置和操作该处理系统。本发明实施例也可以被考虑实施为可机读的存储介质,其被配置成与处理系统一起使用,其中被如此配置的存储介质使处理系统能够以特定的和预定义的方式运行,以执行这里所述的功能。
虽然本发明已经参考图解的实施例进行了说明,但是该说明不应在有限的意义上被解释。该图解的实施例的各种修改方案以及由本领域技术人员看来属于本发明的本发明其他实施例被认为处于本发明的精神和范围之内。

Claims (32)

1.用于自动收集垃圾对象的方法,其包括:
利用一个栈跟踪高速缓存器执行线程的栈中的根集枚举;
通过组合从所有线程的根集枚举中获得的引用来获得根集;
跟踪从根集的引用中可达的活动对象;和
回收由不是活动对象的对象占据的存储空间。
2.按照权利要求1所述的方法,其中所述根集包括所有线程的栈、寄存器和其他存储区中的当前活引用。
3.按照权利要求1所述的方法,其中利用一个栈跟踪高速缓存器执行线程的栈中的根集枚举包括:
确定栈帧是否被缓存在所述栈跟踪高速缓存器中;
如果所述栈帧被缓存在所述栈跟踪高速缓存器中,那么检测自从所述栈跟踪高速缓存器中的最后栈枚举以来没有变化的那部分栈跟踪信息,并且从所述栈跟踪高速缓存器中检索该未改变部分;和
如果所述栈帧没有被缓存在所述栈跟踪高速缓存器中,那么执行该栈中的标准根集枚举。
4.按照权利要求1所述的方法,其中跟踪活动对象包括:标记所述活动对象,并且进一步扫描从所标记的对象中可达的对象。
5.用于执行一个线程的栈中的根集枚举来进行自动垃圾收集的方法,其包括:
初始化栈枚举列表;
为所述线程建立一个栈跟踪高速缓存器;和
利用所述栈跟踪高速缓存器执行该栈中的根集枚举,以产生被更新的栈枚举列表。
6.按照权利要求5所述的方法,其进一步包括:给栈帧附加标签,以指示所述栈帧是已被缓存在所述栈跟踪高速缓存器中,还是在该栈中被重新产生且还没有被缓存在所述栈跟踪高速缓存器中。
7.按照权利要求5所述的方法,其中所述栈枚举列表包括该栈中的当前活引用。
8.按照权利要求5所述的方法,其中建立栈跟踪高速缓存器包括:
确定在该栈中的所述根集枚举是否为第一次被执行;
如果在该栈中的所述根集枚举是第一次被执行,那么动态地建立所述栈跟踪高速缓存器,并且在所述栈跟踪高速缓存器中缓存栈帧的信息,否则
把所述栈跟踪高速缓存器再用于栈中的根集枚举。
9.按照权利要求8所述的方法,其中缓存栈帧的信息包括:利用指令指针寄存器和栈指针寄存器的值将标识符加到每个帧上。
10.按照权利要求8所述的方法,其中再用栈跟踪高速缓存器包括以下至少一个:在没有变化的情况下使用所述栈跟踪高速缓存器,以及改变所述栈跟踪高速缓存器,以容纳新的和被更新的栈帧。
11.按照权利要求5所述的方法,其中利用所述栈跟踪高速缓存器执行栈中的根集枚举包括:
基于所述栈帧的标签确定栈帧是否被缓存在所述栈跟踪高速缓存器中;
如果所述标签的值指示所述栈帧被缓存在所述栈跟踪高速缓存器中,那么从所述栈跟踪高速缓存器把栈跟踪信息的未改变部分复制到所述栈枚举列表中,否则
执行栈中的标准根集枚举。
12.按照权利要求11所述的方法,其中复制所述栈跟踪信息的未改变部分包括:检测自从所述栈跟踪高速缓存器中的最后栈枚举以来没有变化的那部分栈跟踪信息,并且从所述栈跟踪高速缓存器中检索该未改变部分。
13.按照权利要求11所述的方法,其中执行标准栈枚举包括:
展开所述栈,直到到达在所述栈跟踪高速缓存器中被缓存的帧为止;
在所述栈跟踪高速缓存器中缓存未展开的帧的信息;和
把所枚举的引用从所述未展开的帧加到所述栈枚举列表中。
14.一种管理运行时系统,其包括:
虚拟机;
即时编译器;
根集枚举机构,其能够获得根集;
至少一个栈跟踪高速缓存器,当栈帧在根集枚举过程中被枚举时,该栈跟踪高速缓存器能够存储该栈帧的跟踪信息;和
垃圾收集器,其能够跟踪从所述根集中可达的活动对象,并且回收由不是所述活动对象的对象占据的存储空间。
15.按照权利要求14所述的系统,其中所述根集枚举机构包括能够执行栈中的根集枚举的栈枚举机构。
16.按照权利要求14所述的系统,其中所述栈跟踪高速缓存器包括存储栈帧标识符的识别区、和存储栈帧的所枚举的引用的列表区。
17.用于在垃圾收集时栈中的根集枚举的系统,其包括:
栈帧分类器,其能够基于所述栈帧的标签分类栈帧;
栈信息缓存机构,如果所述标签的值指示所述栈帧没被缓存,那么所述栈信息缓存机构能够在栈跟踪高速缓存器中缓存所述栈帧的信息;
未改变的跟踪检测机构,如果所述标签的值指示所述栈帧被缓存,那么所述未改变的跟踪检测机构能够检测自从所述栈跟踪高速缓存器中的最后栈枚举以来还没有变化的那部分栈跟踪信息;和
未改变的跟踪检索机构,其能够从所述栈跟踪高速缓存器中检索栈跟踪信息的未改变部分。
18.按照权利要求17所述的系统,其另外还包括:栈展开机构,其能够展开栈,直到到达在所述栈跟踪高速缓存器中被缓存的栈帧为止。
19.按照权利要求17所述的系统,其中所述跟踪信息缓存机构包括:
高速缓存器建立器,当栈中的根集枚举第一次被执行时,所述高速缓存器建立器能够建立所述栈跟踪高速缓存器;和
帧识别组件,其能够识别所述栈跟踪高速缓存器中的帧。
20.物件,其包括其上存储有内容的机器可访问介质,其中当所述内容由处理器访问时,所述内容通过以下方式规定自动收集垃圾对象:
利用一个栈跟踪高速缓存器执行线程的栈中的根集枚举;
通过组合从所有线程的根集枚举中获得的引用来获得根集;
跟踪从根集的引用中可达的活动对象;和
回收由不是活动对象的对象占据的存储空间。
21.按照权利要求20所述的物件,其中所述根集包括所有线程的栈、寄存器和其他存储区中的当前活引用。
22.按照权利要求20所述的物件,其中用于利用一个栈跟踪高速缓存器执行线程的栈中的根集枚举的内容包括用于以下方面的内容:
确定栈帧是否被缓存在所述栈跟踪高速缓存器中;
如果所述栈帧被缓存在所述栈跟踪高速缓存器中,那么检测自从所述栈跟踪高速缓存器中的最后栈枚举以来没有变化的那部分栈跟踪信息,并且从所述栈跟踪高速缓存器中检索该未改变部分;和
如果所述栈帧没有被缓存在所述栈跟踪高速缓存器中,那么执行该栈中的标准根集枚举。
23.按照权利要求20所述的物件,其中用于跟踪活动对象的内容包括用于以下方面的内容:标记所述活动对象,并且进一步扫描从所标记的对象中可达的对象。
24.物件,其包括其上存储有内容的机器可访问介质,其中当所述内容由处理器访问时,所述内容通过以下方式规定执行一个线程的栈中的根集枚举,以用于自动垃圾收集:
初始化栈枚举列表;
为所述线程建立一个栈跟踪高速缓存器;和
利用所述栈跟踪高速缓存器执行所述栈中的根集枚举,以产生被更新的栈枚举列表。
25.按照权利要求24所述的物件,其另外还包括以下内容,其用于标记栈帧,以指示所述栈帧是已经被缓存在所述栈跟踪高速缓存器中,还是重新在所述栈中被产生且还未被缓存在所述栈跟踪高速缓存器中。
26.按照权利要求24所述的物件,其中所述栈枚举列表包括所述栈中的当前活引用。
27.按照权利要求24所述的物件,其中用于建立栈跟踪高速缓存器的内容包括以下内容,用于
确定在该栈中的所述根集枚举是否为第一次被执行;
如果在该栈中的所述根集枚举是第一次被执行,那么动态地建立所述栈跟踪高速缓存器,并且在所述栈跟踪高速缓存器中缓存栈帧的信息,否则
把所述栈跟踪高速缓存器再用于栈中的根集枚举。
28.按照权利要求27所述的物件,其中用于缓存栈帧的信息的内容包括用于利用指令指针寄存器和栈指针寄存器的值把标识符加到每个帧上的内容。
29按照权利要求27所述的物件,其中用于再用栈跟踪高速缓存器的内容包括下列至少一个:用于在没有变化时利用所述栈跟踪高速缓存器的内容,和用于改变所述栈跟踪高速缓存器以容纳新的和被更新的栈帧的内容。
30.按照权利要求24所述的物件,其中用于利用栈跟踪高速缓存器执行栈中的根集枚举的内容包括以下内容,用于:
基于所述栈帧的标签确定栈帧是否被缓存在所述栈跟踪高速缓存器中;
如果所述标签的值指示所述栈帧被缓存在所述栈跟踪高速缓存器中,那么从所述栈跟踪高速缓存器把栈跟踪信息的未改变部分复制到所述栈枚举列表中,和否则
执行栈中的标准根集枚举。
31.按照权利要求30所述的物件,其中用于复制所述栈跟踪信息的未改变部分的内容包括:用于检测自从所述栈跟踪高速缓存器中的最后栈枚举以来没有改变的那部分栈跟踪信息的内容,和用于从所述栈跟踪高速缓存器中检索该未改变部分的内容。
32.按照权利要求30所述的物件,其中用于执行标准栈枚举的内容包括以下内容,用于:
展开所述栈,直到到达在所述栈跟踪高速缓存器中被缓存的帧为止;
在所述栈跟踪高速缓存器中缓存未展开的帧的信息;和
把所枚举的引用从所述未展开的帧加到所述栈枚举列表中。
CN200480022183.1A 2003-08-01 2004-07-16 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 Expired - Fee Related CN1829977B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US10/632,474 2003-08-01
US10/632,474 US7089273B2 (en) 2003-08-01 2003-08-01 Method and apparatus for improving the performance of garbage collection using stack trace cache
PCT/US2004/023043 WO2005013134A1 (en) 2003-08-01 2004-07-16 Method and apparatus for improving the performance of garbage collection using stack trace cache

Publications (2)

Publication Number Publication Date
CN1829977A true CN1829977A (zh) 2006-09-06
CN1829977B CN1829977B (zh) 2010-08-11

Family

ID=34104390

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200480022183.1A Expired - Fee Related CN1829977B (zh) 2003-08-01 2004-07-16 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置

Country Status (5)

Country Link
US (1) US7089273B2 (zh)
EP (1) EP1652094B1 (zh)
CN (1) CN1829977B (zh)
ES (1) ES2398420T3 (zh)
WO (1) WO2005013134A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012006920A1 (zh) * 2010-07-14 2012-01-19 中兴通讯股份有限公司 一种自适应回收垃圾对象的系统及方法
CN106446289A (zh) * 2016-11-11 2017-02-22 无锡雅座在线科技发展有限公司 基于Pinpoint的信息查询方法和装置
CN106933505A (zh) * 2015-12-29 2017-07-07 爱思开海力士有限公司 存储器系统及其操作方法
CN109313601A (zh) * 2016-05-09 2019-02-05 甲骨文国际公司 用于编码栈踪迹信息的压缩技术
CN110291508A (zh) * 2017-02-01 2019-09-27 微软技术许可有限责任公司 垃圾收集器

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7197521B2 (en) * 2003-11-21 2007-03-27 Intel Corporation Method and system performing concurrently mark-sweep garbage collection invoking garbage collection thread to track and mark live objects in heap block using bit vector
US20050198088A1 (en) * 2004-03-03 2005-09-08 Sreenivas Subramoney Method and system for improving the concurrency and parallelism of mark-sweep-compact garbage collection
US7251671B2 (en) * 2004-03-26 2007-07-31 Intel Corporation Method and system for garbage collection wherein resetting the mark/allocation bit, and switching the mark/allocation bit to the mark bit to perform marking and scanning of objects using the identified object as a root object and providing mark/allocation bit information being displayed at the client
US8109965B2 (en) 2004-06-09 2012-02-07 Biomet Sports Medicine, LLP Method and apparatus for soft tissue fixation
US7926048B2 (en) 2006-07-26 2011-04-12 Intel Corporation Efficient call sequence restoration method
US8156492B2 (en) * 2007-09-07 2012-04-10 Oracle International Corporation System and method to improve memory usage in virtual machines running as hypervisor guests
US8880775B2 (en) * 2008-06-20 2014-11-04 Seagate Technology Llc System and method of garbage collection in a memory device
US8825719B2 (en) * 2008-10-30 2014-09-02 Microsoft Corporation Incremental lock-free stack scanning for garbage collection
US20100293206A1 (en) * 2009-05-12 2010-11-18 Tatu Ylonen Oy Ltd Clustering related objects during garbage collection
US8898376B2 (en) 2012-06-04 2014-11-25 Fusion-Io, Inc. Apparatus, system, and method for grouping data stored on an array of solid-state storage elements
CN102929699B (zh) * 2012-10-10 2015-06-10 武汉钢铁(集团)公司 一种Java虚拟机的垃圾回收方法及其监测系统
US9032410B1 (en) * 2014-08-19 2015-05-12 Xamarin Inc. Non-precise garbage collection in non-cooperative systems
US9507655B2 (en) * 2014-10-31 2016-11-29 AppDynamics, Inc. Tracking asynchronous entry points for an application
WO2017095372A1 (en) * 2015-11-30 2017-06-08 Hewlett Packard Enterprise Development Lp Pointers in a memory managed system
US10162552B2 (en) * 2016-03-31 2018-12-25 EMC IP Holding Company LLC System and method for quasi-compacting garbage collection
US11442739B2 (en) * 2019-09-16 2022-09-13 International Business Machines Carporation Exception handling

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1206525A (zh) * 1995-12-28 1999-01-27 德纳克公司 动态同步传输模式网络中的碎片整理方法和装置
US6101580A (en) 1997-04-23 2000-08-08 Sun Microsystems, Inc. Apparatus and method for assisting exact garbage collection by using a stack cache of tag bits
US5848423A (en) * 1997-04-23 1998-12-08 Sun Microsystems, Inc. Garbage collection system and method for locating root set pointers in method activation records
US5893121A (en) * 1997-04-23 1999-04-06 Sun Microsystems, Inc. System and method for swapping blocks of tagged stack entries between a tagged stack cache and an untagged main memory storage
US6093216A (en) * 1998-05-29 2000-07-25 Intel Corporation Method of run-time tracking of object references in Java programs
US6470361B1 (en) 2000-01-10 2002-10-22 International Business Machines Corporation Method and apparatus for performing generational garbage collection using middle-aged objects
US6523141B1 (en) * 2000-02-25 2003-02-18 Sun Microsystems, Inc. Method and apparatus for post-mortem kernel memory leak detection
US6769004B2 (en) 2000-04-27 2004-07-27 Irobot Corporation Method and system for incremental stack scanning
US6748503B1 (en) * 2001-06-27 2004-06-08 Microsoft Corporation System and method facilitating unmanaged code participation in garbage collection
US6978285B2 (en) * 2002-08-22 2005-12-20 Intel Corporation Methods and apparatus for concurrent enumeration of an object reference root set

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012006920A1 (zh) * 2010-07-14 2012-01-19 中兴通讯股份有限公司 一种自适应回收垃圾对象的系统及方法
CN106933505A (zh) * 2015-12-29 2017-07-07 爱思开海力士有限公司 存储器系统及其操作方法
CN106933505B (zh) * 2015-12-29 2020-06-19 爱思开海力士有限公司 存储器系统及其操作方法
CN109313601A (zh) * 2016-05-09 2019-02-05 甲骨文国际公司 用于编码栈踪迹信息的压缩技术
CN109313599A (zh) * 2016-05-09 2019-02-05 甲骨文国际公司 将线程强度和堆使用量相关以识别堆囤积的栈踪迹
US11327797B2 (en) 2016-05-09 2022-05-10 Oracle International Corporation Memory usage determination techniques
CN109313601B (zh) * 2016-05-09 2022-05-24 甲骨文国际公司 用于编码栈踪迹信息的方法、系统和介质
CN109313599B (zh) * 2016-05-09 2022-06-03 甲骨文国际公司 将线程强度和堆使用量相关以识别堆囤积的栈踪迹
CN106446289A (zh) * 2016-11-11 2017-02-22 无锡雅座在线科技发展有限公司 基于Pinpoint的信息查询方法和装置
CN106446289B (zh) * 2016-11-11 2019-10-01 无锡雅座在线科技股份有限公司 基于Pinpoint的信息查询方法和装置
CN110291508A (zh) * 2017-02-01 2019-09-27 微软技术许可有限责任公司 垃圾收集器

Also Published As

Publication number Publication date
US7089273B2 (en) 2006-08-08
CN1829977B (zh) 2010-08-11
ES2398420T3 (es) 2013-03-19
EP1652094B1 (en) 2012-11-21
US20050027761A1 (en) 2005-02-03
WO2005013134A1 (en) 2005-02-10
EP1652094A1 (en) 2006-05-03

Similar Documents

Publication Publication Date Title
CN1829977B (zh) 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置
US7103723B2 (en) Priority-based code cache management
JP4248025B2 (ja) 追跡型ゴミ集め用のスペースの限られたマーク付け構造
US6757890B1 (en) Methods and apparatus for enabling local Java object allocation and collection
US6442751B1 (en) Determination of local variable type and precision in the presence of subroutines
US20020087589A1 (en) Methods and apparatus for optimizing garbage collection
CN110162306B (zh) 系统的提前编译方法和装置
US8438468B2 (en) Annotation management
CN101515248A (zh) 面向对象程序的跟踪方法和系统
JP2001527237A (ja) 増分不要情報収集
US10031843B2 (en) Managing memory in a computer system
US8042103B2 (en) Pre-translated files used in a virtual machine
CN1728106A (zh) 一种应用程序故障的定位方法
CN1556951A (zh) 在具备解释器和编译器的混合式系统中用于无用存储单元收集的被编译激活框架内的惰型标记
US20020073404A1 (en) Method and apparatus for storing long-lived objects in a virtual machine
US6581077B2 (en) Method and apparatus for storing short-lived objects in a virtual machine
US6735761B1 (en) Compile method frame detection method and device code discarding method and computer
JP2004295889A (ja) データ処理システム内での処理タスクの実行を制御する方法および装置
CN100549958C (zh) 一种类文件装载方法和系统
US6907437B1 (en) Memory management using object pointer structure
CN1556472A (zh) 一种嵌入式系统中可执行文件的压缩及其加载方法
US20050039189A1 (en) Methods and apparatus to preemptively compile an application
CN1180338C (zh) 对只读存储器中存储的资源文件的访问
KR100763199B1 (ko) 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템
US11513954B2 (en) Consolidated and concurrent remapping and identification for colorless roots

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20100811

Termination date: 20150716

EXPY Termination of patent right or utility model