CN1829977B - 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 - Google Patents
利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 Download PDFInfo
- Publication number
- CN1829977B CN1829977B CN200480022183.1A CN200480022183A CN1829977B CN 1829977 B CN1829977 B CN 1829977B CN 200480022183 A CN200480022183 A CN 200480022183A CN 1829977 B CN1829977 B CN 1829977B
- Authority
- CN
- China
- Prior art keywords
- stack
- trace
- frame
- enumerated
- information
- 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.)
- Expired - Fee Related
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
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99941—Database schema or data structure
- Y10S707/99944—Object-oriented database structure
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99956—File allocation
- Y10S707/99957—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)
- 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 (19)
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所述的系统,其中所述跟踪信息缓存机构包括:
高速缓存器建立器,当栈中的根集枚举第一次被执行时,所述高速缓存器建立器能够建立所述栈跟踪高速缓存器;和
帧识别组件,其能够识别所述栈跟踪高速缓存器中的帧。
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 CN1829977A (zh) | 2006-09-06 |
CN1829977B true 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) |
Families Citing this family (21)
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 |
CN101894049A (zh) * | 2010-07-14 | 2010-11-24 | 中兴通讯股份有限公司 | 一种自适应回收垃圾对象的系统及方法 |
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 |
KR20170078315A (ko) * | 2015-12-29 | 2017-07-07 | 에스케이하이닉스 주식회사 | 메모리 시스템 및 메모리 시스템의 동작방법 |
US10162552B2 (en) * | 2016-03-31 | 2018-12-25 | EMC IP Holding Company LLC | System and method for quasi-compacting garbage collection |
US10534643B2 (en) * | 2016-05-09 | 2020-01-14 | Oracle International Corporation | Correlation of thread intensity and heap usage to identify heap-hoarding stack traces |
CN106446289B (zh) * | 2016-11-11 | 2019-10-01 | 无锡雅座在线科技股份有限公司 | 基于Pinpoint的信息查询方法和装置 |
US10628306B2 (en) * | 2017-02-01 | 2020-04-21 | Microsoft Technology Licensing, Llc | Garbage collector |
US11442739B2 (en) * | 2019-09-16 | 2022-09-13 | International Business Machines Carporation | Exception handling |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1206525A (zh) * | 1995-12-28 | 1999-01-27 | 德纳克公司 | 动态同步传输模式网络中的碎片整理方法和装置 |
US6470361B1 (en) * | 2000-01-10 | 2002-10-22 | International Business Machines Corporation | Method and apparatus for performing generational garbage collection using middle-aged objects |
US20030126352A1 (en) * | 2000-04-27 | 2003-07-03 | Barrett Kim A. | Method and system for incremental stack scanning |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
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 |
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 |
US6093216A (en) * | 1998-05-29 | 2000-07-25 | Intel Corporation | Method of run-time tracking of object references in Java programs |
US6523141B1 (en) * | 2000-02-25 | 2003-02-18 | Sun Microsystems, Inc. | Method and apparatus for post-mortem kernel memory leak detection |
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 |
-
2003
- 2003-08-01 US US10/632,474 patent/US7089273B2/en not_active Expired - Fee Related
-
2004
- 2004-07-16 CN CN200480022183.1A patent/CN1829977B/zh not_active Expired - Fee Related
- 2004-07-16 EP EP04778511A patent/EP1652094B1/en not_active Expired - Lifetime
- 2004-07-16 WO PCT/US2004/023043 patent/WO2005013134A1/en active Application Filing
- 2004-07-16 ES ES04778511T patent/ES2398420T3/es not_active Expired - Lifetime
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1206525A (zh) * | 1995-12-28 | 1999-01-27 | 德纳克公司 | 动态同步传输模式网络中的碎片整理方法和装置 |
US6470361B1 (en) * | 2000-01-10 | 2002-10-22 | International Business Machines Corporation | Method and apparatus for performing generational garbage collection using middle-aged objects |
US20030126352A1 (en) * | 2000-04-27 | 2003-07-03 | Barrett Kim A. | Method and system for incremental stack scanning |
Also Published As
Publication number | Publication date |
---|---|
US7089273B2 (en) | 2006-08-08 |
EP1652094A1 (en) | 2006-05-03 |
EP1652094B1 (en) | 2012-11-21 |
WO2005013134A1 (en) | 2005-02-10 |
CN1829977A (zh) | 2006-09-06 |
US20050027761A1 (en) | 2005-02-03 |
ES2398420T3 (es) | 2013-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1829977B (zh) | 利用一个栈跟踪高速缓存器改善垃圾收集的性能的方法和装置 | |
US7103723B2 (en) | Priority-based code cache management | |
US6757890B1 (en) | Methods and apparatus for enabling local Java object allocation and collection | |
JP4248025B2 (ja) | 追跡型ゴミ集め用のスペースの限られたマーク付け構造 | |
US6820101B2 (en) | Methods and apparatus for optimizing garbage collection using separate heaps of memory for storing local objects and non-local objects | |
CN110162306B (zh) | 系统的提前编译方法和装置 | |
US7882499B2 (en) | Caching dynamically compiled code to storage | |
CN101583927B (zh) | 独立于踪迹的存储地址来定义踪迹句柄 | |
US8438468B2 (en) | Annotation management | |
CN101515248A (zh) | 面向对象程序的跟踪方法和系统 | |
US6681234B2 (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 | |
US8176286B2 (en) | Memory recycling in computer systems | |
CN100549958C (zh) | 一种类文件装载方法和系统 | |
US6732355B1 (en) | Method and device for generating registration data at compilation to enable trace of stack | |
US6907437B1 (en) | Memory management using object pointer structure | |
US20050039189A1 (en) | Methods and apparatus to preemptively compile an application | |
KR100763199B1 (ko) | 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템 | |
US11513954B2 (en) | Consolidated and concurrent remapping and identification for colorless roots | |
US11573794B2 (en) | Implementing state-based frame barriers to process colorless roots during concurrent execution | |
US20220308933A1 (en) | Tracking frame states of call stack frames including colorless roots | |
JP2000035890A (ja) | コンパイル方法、フレーム検出方法及び装置、コード破棄方法、並びにコンピュータ | |
US20030126305A1 (en) | Method and apparatus for efficient object sub-typing | |
US20060288338A1 (en) | Offset threaded code |
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 |