CN102016788A - 高效地标记带有大引用集的对象 - Google Patents
高效地标记带有大引用集的对象 Download PDFInfo
- Publication number
- CN102016788A CN102016788A CN2009801146883A CN200980114688A CN102016788A CN 102016788 A CN102016788 A CN 102016788A CN 2009801146883 A CN2009801146883 A CN 2009801146883A CN 200980114688 A CN200980114688 A CN 200980114688A CN 102016788 A CN102016788 A CN 102016788A
- Authority
- CN
- China
- Prior art keywords
- quoting
- labeled slots
- slots
- quote
- pointer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
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/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
将对对象的引用添加到标记栈。对带有大量对象引用的对象所引用的对象的有限数量的引用被添加到栈中。访问对象。做出应该结合指针使用标记栈中的对对象的引用将对象中的引用添加到标记栈的判定。使用指针来跟踪对象中的哪些引用已经被放置在标记栈上。访问标记栈上的对对象的引用。初始化指针。对对象所引用的另一对象的引用被压到标记栈上。递增指针。然后判定应该将更多的引用压到标记栈。重复将引用压到标记栈上以及递增指针的动作。
Description
背景
背景及相关
在计算机系统中,常常需要管理存储器。具体地,当对象不再使用时,恢复被分配给该对象使用的存储器是有用的。当今使用的某些系统使用显式存储器管理,由此系统使用命令来分配存储器并使用相应的命令来释放存储器。例如,C编程语言包括可用于为对象分配存储器的命令“malloc”和可用于释放之前分配的存储器的命令“free”。然而,这种类型的存储器分配和解除分配遭受若干缺点。具体地,空闲存储器可以散布在存储器结构的各处。另外,这种类型的分配和解除分配允许可用于损害数据的恶意攻击。例如,黑客可以使已经由一线程分配的存储器成为解除分配的,从而使得恶意线程能够改变或访问存储在存储器中的数据。
为了对抗这些缺点,已经创建了使用自动存储器管理的系统,其中该系统包括用于标识不再使用的对象的无用信息收集器。用于不再使用的对象的存储器可被标识为空闲存储器,从而使得该存储器可用于新对象的创建。典型的无用信息收集涉及标记从根的引用开始可以到达的对象以及回收任何未被标记的对象的存储器。标记可以通过在对象中设置(或清除)标志(诸如单个位)来发生。在扫描了堆之后,对象的所有标志被清除(或设置)从而使得后续无用信息收集可以发生。
为了执行标记活动,根提供对一个或多个使用中的对象的引用。访问并标记这些对象。然后跟随从这些对象到其他对象的引用再到其他对象。标记其他对象且跟随其对再一些其他对象的引用,直到所有从根开始可到达的对象都已经被标记。
为了便于标记,可以采用标记栈。标记栈允许在标记栈上输入在一对象处对其他对象的引用。当标记栈的大小有限时,标记栈可能溢出。例如,如果访问具有12个引用的对象而标记栈只有10个空闲条目,则判定已经发生了溢出且对所引用的12个对象的引用不被压到标记栈上。
通常,在发生溢出时,通过检查存储器来判定对象是否被标记以及是否被对象中的接下来的引用所标记,并标记该引用所引用的对象,来线性地检查包括对象的堆。虽然在能够实现溢出范围时可能不一定要检查整个堆,但如可以理解的,这仍然可以导致耗时且资源密集的标记过程。
在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实施例。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施例的一个示例性技术领域。
简要概述
此处所公开的一实施例涉及在包括实现用于回收存储器以供新对象使用的无用信息收集功能的应用程序代码的计算环境中实践的一种方法。无用信息收集功能包括将对象引用压到标记栈上,从而使得标记栈上所引用的对象可以被标记以便阻止用于被标记的对象的存储器被回收以供其他对象实例使用。该方法包括按照允许对带有大量对象引用的对象所引用的对象的有限数量的引用被添加到标记栈中的方式将对对象的引用添加到标记栈中的动作。该方法包括访问对象。做出应该结合指针使用标记栈中对象本身的引用来将对象中的引用添加到标记栈中的判定。使用指针来跟踪已经被放置在标记栈上的对象中的引用。访问对标记栈上的对象的引用。初始化指针。对对象所引用的另一对象的引用被压到标记栈上。递增指针。在将对另一对象的引用进栈并递增指针之后,判定应该将更多的引用压入标记栈,且结果,重复将引用压到标记栈上及递增指针的动作。处理来自标记栈的各引用,直到对对象的引用处于要从标记栈读取的位置中。在处理了来自标记栈的引用之后,做出来自对象的更多引用应该被添加到标记栈中的判定,且结果,重复将引用压到标记堆栈上及递增指针的动作。做出没有来自对象的更多引用应被添加到标记栈上的判定,且结果,从标记栈中弹出标记栈中对对象本身的引用。
提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
另外的特征和优点将在以下的描述中阐述,并且部分可从该描述中显而易见,或者可以从此处的教示实践中习得。本发明的特征和优点可以通过在所附权利要求中特别指出的手段和组合来实现并获取。本发明的特征将从以下描述和所附权利要求书中变得完全显而易见,或者可通过如下所述对本发明的实践而获知。
附图简述
为了描述能够获得上述和其他优点和特征的方式,将通过参考附图中示出的各具体实施例来呈现对以上简述的主题的更为具体的描述。应该理解,这些附图仅描绘了各典型实施例,因此其不应被认为是对范围的限制,各实施例将通过使用附图用附加附加特征和细节来描述并解释,在附图中:
图1示出无用信息收集过程;
图2A和2B示出与带有多个引用的对象有关的附加无用信息收集过程。
图3示出一种执行无用信息收集过程的方法。
详细描述
如上所述,在无用信息收集器标记阶段期间当需要检查所有落入溢出范围内的对象时,处理使标记栈溢出的溢出对象可能是非常昂贵的。因此,此处所描述的某些实施例实现了用于降低溢出情况的可能性的功能。例如,这可以通过识别处理对象何时将导致大量引用被压到标记栈上来实现。使用标记栈上对对象本身的引用以及用于标识对象中的引用的指针,可以减少给定时刻标记栈上的引用数量。
现在参考图1,示出了各种无用信息收集活动和分配活动的示例。图1示出堆102。堆102包括系统存储器,诸如可用于存储对象的系统RAM或其他系统存储器。堆102包括若干段104。应该注意这一点:当附图包括所示项的一个以上实例时,对附图中的标志符的引用可以概括地或具体地做出。例如,概括引用可以包括对段104的概括地引用,而对具体段的引用可以包括追加到诸如图1所示的引用等的附加标志符,其中对段104的具体引用包括附加标志符从而具体引用可以是104(a),104(b),104(c),和104(d)。
段104是已经由操作系统分配来存储用于在操作系统环境中运行的代码的存储器空间120中的对象的堆102的一部分。图1还示出可以存储在段104中的若干对象106。
对象106可包括可以随对象而变化的附加部分。例如,对象106可包括包含关于对象106的信息的头部108,该信息包括诸如类类型、大小等的信息。对象106可包括对其他对象106的引用110。另外,对象106可包括数据成员112。数据成员112可包括原始低级数据,如整数、布尔、浮点数、字符和串。
现在示出无用信息收集标记和对死空间活动的回收,图1示出根114。根114包括对当前正在使用的对象的引用。在映射对象和对象引用之前,可以拍摄系统状态的快照来标识给定时刻的对象状态。然后释放对象从而使得其他用户线程可以与对象交互。对快照执行无用信息收集活动以便允许其他活动继续与对象的交互。为了执行无用信息收集,可跟随根条目中的引用到一对象。例如,根引用116(a)指向对象106(a)。在所示出的示例中,随后可以标记对象106(a)来指示对象106(a)当前正在使用。在一实施例中,将对象106标记为当前正在使用可包括在对象106的头部108中设置一位或清除一位。因此,在所示出的示例中,出于标记对象的目的而留出的一位可以设置在对象106(a)的头部108(a)中来标记对象106(a)。
一旦由于根引用116的引用而访问对象106,然后可以跟随对象中的其他引用110来标记其他对象。例如,引用110(a)指向对象106(b)。跟随引用110(a)允许通过设置头部108(b)中的一位来标记对象106(b)以指示对象106(b)当前正在使用。也可以跟随对象106(b)中的引用110来找到其他对象106。例如,对象106(b)包括指向对象106(c)的引用110(b)。跟随引用110(b)到对象106(c)允许通过设置头部108(c)中的一位将对象106(c)标记为当前正在使用。
因为对象106(c)不包括对任何其他对象的引用110,所以处理随后可以返回至对象106(a)来跟随引用110(c)到对象106(d)。然后通过设置头部108(d)中的一位将对象106(d)标记为当前正在使用。因为对象106(d)不包括任何引用110,所以处理可以返回至根114来检查引用对象106(e)的根引用116(b)。然后可以通过设置头部108(d)中的一位将对象106(e)标记为当前正在使用。在该特定示例中,对象106(e)包括数据成员112(b)-112(h)的数组118,从而使得对象106(e)不包括任何对其他对象106的引用110。处理因此返回至根114来检查根引用116(c)。根引用116(c)指向对象106(f)。通过设置头部108(f)中的一位来标记对象106(f)以指示对象106(f)正在使用。
对象106(f)包括引用110(d)。引用110(d)指向对象106(b)。此时,做出对象106(b)已经被标记的判定且因此在该特定链上的处理使得处理返回至根114。具体地,应该注意,处理可包括在标记对象106之前检查头部108中的标记位。因此,可以发现已经被标记的对象106以便在执行标记操作时节省系统资源。
在根114处,引用指向对象106(g)的根引用116(d)。通过设置头部108(g)中的一位来标记对象106(g)。对象106(g)包括指向对象106(h)的引用110(e)。通过设置头部108(h)中的一位来标记对象106(h)以指示对象106(h)。
此时,因为根114不再包括其他根引用116,且已经跟随了根引用116或之前引用的其他对象106中的引用110所引用的所有对象,所以可以执行回收死空间的操作。注意,图1示出未被标记且因此适合恢复它们的存储器以供其他对象使用的三个对象,对象106(i)、对象106(j)和对象106(k)。在一实施例中,这可以通过将段104中的存储器空间标记为空闲空间来实现。这在段104(c)中示出,其中存储器空间120(b)、120(c)和120(d)已经被标记为空闲空间。
虽然以上所示出的示例已经示出直接跟踪并标记对象106,但标记可包括对标记栈124的使用。具体地,当由于跟随引用而到达对象106时,所有的对象引用被压到标记栈124上从而使得可以使用标记栈124来确保所有适当的映射发生。
例如,在图1所示出的示例中,跟随根引用116(a)到对象106(a)使得对分别由110(a)和110(c)引用的对象106(b)和106(d)的引用分别作为标记栈槽126(b)和126(a)被压到标记栈124上。然后从标记栈124中弹出标记栈124中到对象106(b)的槽126(a)来映射到对象106(b)。当映射到对象106(b)时,则由于引用110(b)将对对象106(c)的引用作为槽126(a)压到标记栈124上。从标记栈中弹出到对象106(c)的槽126(a),之后判定对象106(c)不含引用。之后,从标记栈124中弹出到对象106(d)的槽126(a),在那时判定对象106(d)不含引用。因为标记栈124此时是空的,所以处理按照如上所述的相同方式在根引用116(b)处继续。另外,处理还可对根引用116(c)和116(d)继续,直到所有使用中的对象都被标记。
如可以想象的,当标记栈124大小有限或标记栈124可以增长的数量有限时,可能发生标记栈124的溢出。例如,考虑标记栈124具有10个空闲条目但已到达的对象106具有12个引用的情况。能够检测这种情况并可以提供标记栈已经溢出的指示符。当溢出发生时,某些系统通过对堆102的线性检查来直接查看并标记堆102中的对象。例如,无用信息收集器线程可以开始检查段104。当发生溢出情况时,在段104处开始的线性检查发现一对象。做出关于该对象是否被标记的判定。如果该对象被标记,则无用信息收集器跟踪该对象的全部引用。如果该对象未被标记,则无用信息收集器跳过该对象(通过将存储器跳过由对象大小所指示的该对象的大小)以开始对段104的其他部分的检查。该线性检查在计算上可能是昂贵的。
因此,此处描述的某些实施例实现用于识别对象何时包括大量引用、将对对象本身的引用压到标记栈上以及使用指针来标识对象中的引用的功能。使用这种安排,可以在给定机会时将来自对象的有限数量的引用压到标记栈上从而降低标记栈溢出的可能性。
图2A和2B中示出一示例。图2A示出标记栈124。图2A还示出对象106(l)。对象106(l)包括引用110(f)到110(N)的数组132,其中N是给定的数字,该数字是数组132中引用110的数量。可以做出处理对象106(l)应该包括处理少于对象106(l)的数组132中的所有引用的判定。这可以用多个不同的方式来实现。例如,一实施例可以判定数组132包括大于预定阈值的数量的引用。或者,可以基于标记栈124中的可用引用槽的数量做出数组132包括将引起标记栈124溢出的数量的引用的判定。
如图2A所示,指针136被压到标记栈124的槽126(a)处。另外,将一条目形成到标记栈124的槽126(b)中。该条目包括基于对象引用的条目134和指针136。在本示例中,基于对象引用的条目134包括对对象106(l)的引用与1求或(OR),使得基于对象引用134的条目134的值是奇数。因为通常对真实对象地址的引用总是偶数,所以使用奇数。因此,奇数的使用可以用作正在使用引用和指针的有效指示。指针136包括可用于判定来自对象106(l)的哪个引用110已经被压到标记栈124上的指示符。在所示出的示例中,指针136在0处被初始化且被实现为与对象引用的偏移量。可以实现其中指针直接指向对象中的引用的其他实施例。
可以实现各实施例来将来自对象106的若干引用添加到标记栈124。在本示例中,若干(M个)引用被添加到标记栈。该若干引用可以是预定数量的引用、将填满标记栈124的数量的引用、或某一其他数量的引用。在所示出的示例中,引用的数量被预定为10(即M=10)。因此,在该示例中,来自数组132的十个引用110被添加到标记栈124。图2A示出在来自对象106(l)的引用被添加到标记栈124之前的标记栈,而图2B示出在10个引用被压到标记栈124之后的标记栈。
为获得图2B所示的状态而执行的操作包括将来自对象106(l)的对象引用压到标记栈以及在对象引用被压到标记栈124时更新指针136。在所示出的示例中,对象引用被压到标记栈124中的、指针和引用已经在其中的槽126(a)和126(b)之后的标记栈槽。因此,在该示例中,对象引用被压到槽126(c)到126(l)。在某些实施例中,可以在每一引用被压到标记栈时更新指针。或者,可以在所有M个引用都被压到标记栈时更新指针136。
然后可以处理来自标记栈124的引用并如前所述地从标记栈124中弹出引用。当已经从标记栈124中弹出足够数量的引用从而使得基于对象引用的条目134处在要从标记栈124读取的位置中时,可以做出应该将来自对象106(l)的附加引用添加到标记栈124的判定。这可以基于判定基于对象引用的条目134是专门类型的引用来完成。在一实施例中,这可通过使用标志或其他指示符来实现。具体地,以及一实施例,由于对对象引用的典型存储器要求,标记栈124中的典型的对象引用是基于偶数地址的。因此,在一实施例中,可以通过执行诸如在对象引用上与“1”求或以使基于对象引用的条目134为奇数等的操作来创建专门指示符。
以下讨论现在涉及多种方法以及可以执行的方法动作。应当注意,虽然以特定次序讨论了这些方法动作,但除非具体规定或因为一动作依赖于在该动作执行之前完成的另一动作而需要特定排序,否则不一定需要特定排序。事实上,在不影响整体功能的情况下可以改变所示出的许多元素的次序。
现在参考图3,示出了图示可以执行的若干活动的方法300。方法300是参考图1、2A和2B中所示的元素来示出的,然而应该明白,可以使用其他元素且各示例仅仅是说明性的。方法300可以在包括实现用于回收存储器以供新对象使用的无用信息收集功能的应用程序代码的计算环境中来实践。无用信息收集功能包括将对象引用压到标记栈124上,从而使得标记栈上所引用的对象106可以被标记以便阻止用于被标记的对象106的存储器被回收以供其他对象实例使用。该方法包括按照允许对带有大量对象引用110的对象106所引用的对象106的有限数量的引用110被添加到标记栈124的方式来将对对象106的引用添加到标记栈124的动作。方法300包括访问对象(动作302)。例如,对象106(l)(图2A)可作为访问根引用126的结果而被引用。
方法300还包括判定应该结合指针(136)使用标记栈中的对对象(106l)本身的引用(134)来将对象106(l)中的引用110添加到标记栈(动作304)。使用指针(136)来跟踪对象中的哪些引用(110)已经被压到标记栈(124)上。指针136可随对对象106(l)的引用134一起被包括在标记栈124中,或者指针136可以存储在与标记栈124分开的单独位置中。
可以执行方法300,其中判定应该结合指针136使用标记栈124中对对象106(l)本身的引用134来将对象106(l)中的引用110添加到标记栈124(动作304)包括判定对象106(l)包含各引用的数组132。如图2A所示,数组132包括若干元素,其中各元素是对其他对象106的引用110。可以基于数组132的大小或其他因素,在包括数组132的对象106(l)的基础上严格地执行动作302的判定。
在替换实施例中,判定应该结合指针136使用标记栈124中对对象106(m)本身的引用134将对象(在该示例中是对象106(m))中的引用110添加到标记栈124(动作304)可包括判定对象106(m)包含至少预定数量的可以获得来自给定引用站点的下一引用的引用。例如,图2B示出对象106(m),其中下一引用可以从之前的引用来确定。例如,引用110(y)可以从引用110(x)来确定。类似地,引用110(z)可以从引用110(y)来确定。当可以按照这种方式来确定给定数量的引用时,可以做出执行动作304的决定。
方法300还包括访问标记栈124上的对对象106(l)的引用(动作306)。这可以包括访问诸如条目134等的一种形式的引用、如果对对象106(l)的引用或基于该引用的条目134还没有在标记栈124中则将基于对对象106(l)的引用的条目134添加到标记栈124、如果对对象106(l)的引用已经在标记栈124上则修改对对象106(l)的引用、和/或其他活动。在某些实施例中,访问标记栈124上的对对象106(l)的引用(动作306)可包括在标记栈124中设置对应于对标记栈124中的对该对象的引用的标志来指示应该结合对对象的引用来引用指针136以将来自对象106(l)的引用110添加到标记栈124。在该实施例的某一特定版本中,标志可包括导致基于对对象的引用的条目134引用奇数地址的、对对象引用的改变。也可以使用其他标志,如头部、单独的表、注册表中等的标志。
方法300还包括初始化指针136(动作308)。例如,图2A示出已经被初始化为0的指针136。这可以在指针表示与引用的偏移量时完成。在其他实施例中,指针可以被设置成引用的值。
现在跳过动作310,方法300还包括将来自对象106(l)的引用110压到标记栈124上(动作312)。例如,这可以包括将对象106(l)所引用的对另一对象106的引用压到标记栈124上。例如,图2A示出引用110的数组132。引用110之一所引用的对对象106的引用110可以被压到标记栈124上。
方法300还包括如M=M-1所示地递减计数器(动作314)。这允许对添加到标记栈124的引用的数量进行计数来确保给定数量的引用被添加到标记栈124。
方法300还包括判定来自对象106(l)的更多引用110是否应该被添加到标记栈124,如判定M=0所示的动作(动作316)。例如,方法300可包括将动作312重复若干次或预定次数(即M次)来将若干引用或预定数量的引用添加到标记栈124。例如,已经发现向标记栈124添加10个引用是尤其有用的。该数量也可以少至1次。在其他实施例中,可以执行重复动作312直到标记栈124满,而不是将动作312重复预定次数。标记栈124满也可包括标记栈124无法再被扩展。各实施例还可重复动作312直到对象106(l)中不再剩余应该被压到标记栈上的引用110。这由动作310示出,其示出了做出来自数组132的所有N个引用110都已经被添加到标记栈124的判定。
现在返回至316处的判定,在判定了M=0之后,可以将M重置为预定数量,在该示例中为10,从而可以执行动作312和314的附加循环和执行来处理来自对象106(l)的附加引用110。
方法300还可包括在所有预定数量的引用已经被添加到标记栈124之后(例如,在M已经递减至0之后),更新指针136。在一实施例中,这可以通过将M加到指针的值来发生。例如,图2B示出将指针从值0更新到值10。在该示例中,M=10。对指针的更新仅仅加了0+10。如所述的,对指针的更新还可以通过在每一引用110被压到标记栈124之后递增指针136来发生。
方法300还包括处理预定引用中的每一引用并从标记栈124中弹出预定引用中的每一引用直到标记栈124中对对象106(l)本身的引用134处在要从标记栈124读取的位置中(动作320)。处理引用可包括跟随所引用的对象中的引用并在适当时将附加引用添加到标记栈。例如,图1示出处理引用110(a)导致跟随引用110(a)到对象106(b)并将对象106(b)添加到标记栈124。
现在返回至动作310,方法300还示出通过判定来自对象106(l)的所有N个(其中对该示例,N是该对象106(l)的引用110(N)中示出的N)引用是否都已经被添加到标记栈124,可以做出应该将来自对象106(l)的更多引用添加到标记栈的判定(动作318)。例如,可以判定应该将对象106(l)本身中的更多引用添加到标记栈。由此,可以将更多的引用添加到标记栈124。例如,处理可以返回至动作312从而使得可以将动作312和314重复预定次数来将附加的预定数量的引用添加到标记栈124。可以使用指针136来确定在对象106(l)的数组132中的何处应如所述地处理来自对象106(l)的附加引用。或者,可以做出来自对象106(l)的所有引用已经被压到标记栈124上的判定。在这种情况下,方法300示出判定对应于对象中的所有引用的条目已经被添加到标记栈,且结果,从标记栈124中弹出对标记栈124中对对象106(l)本身的引用134和指针136(如果其被包括在标记栈124上的话)(动作322)。在一实施例中,这可以通过在各种无用信息收集活动的普通执行中将条目134设置为0以及将指针136设置为0从而使其从标记栈124中弹出来完成。
本文的各实施例可以包括含有各种计算机硬件的专用或通用计算机,这将在以下做出更详细的讨论。
各实施例还可包括用于承载或其上储存有计算机可执行指令或数据结构的计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机访问的任何可用介质。作为示例而非限制,这样的计算机可读介质可以包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备,或可以用来携带或存储计算机可执行指令或数据结构的形式的所需程序代码装置并可由通用或专用计算机访问的任何其他介质。当通过网络或另一通信连接(硬连线、无线,或硬连线或者无线的组合)向计算机传输或提供信息时,该计算机适当地将该连接视为计算机可读介质。如此,任何这样的连接被适当地称为“计算机可读介质”。上面各项的组合也应该包括在计算机可读介质的范围内。
计算机可执行指令包括例如使通用计算机、专用计算机或专用处理设备执行某一功能或一组功能的指令和数据。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。相反,上文所描述的具体特征和动作是作为实现权利要求的示例形式来公开的。
在不偏离本发明的精神或必要特征的情况下,本发明能以其他具体形式来实现。所描述的实施例在各个方面都只作为说明性的,而不是限制性的。因此,本发明的范围由所附权利要求书而不是由前面的描述指出。在权利要求的等效方案内的含义和范围内的所有更改都将包括在它们的范围内。
Claims (20)
1.一种在包括实现用于回收存储器以供新对象使用的无用信息收集功能的应用程序代码的计算环境中的方法,其中所述无用信息收集功能包括将对象引用压到标记栈上,从而使得所述标记栈上所引用的对象可以被标记以便阻止用于被标记的对象的存储器被回收以供其他对象实例使用,所述方法按照允许对带有大量对象引用的对象所引用的对象的有限数量的引用被添加到所述标记栈的方式将对对象的引用添加到所述标记栈,所述方法包括:
(a)访问对象(302);
(b)判定应该结合指针使用所述标记栈中对所述对象本身的引用或基于该引用的条目来将所述对象中的引用添加到所述标记栈,所述指针用于跟踪所述对象中的哪些引用已经被压到所述标记栈上,所述标记栈被配置成允许标记被压到所述标记栈上的对象来阻止用于所述标记栈上所引用的对象的存储器被回收以供其他对象使用(304);
(c)访问所述标记栈上对所述对象的引用或基于该引用的条目(306);
(d)初始化指针(308);
(e)将对所述对象所引用的一个或多个其他对象的一个或多个引用压到所述标记栈上(312);以及
(f)更新所述指针(318)。
2.如权利要求1所述的方法,其特征在于,执行动作(e)以便将预定数量的引用添加到所述标记栈。
3.如权利要求2所述的方法,其特征在于,还包括在所有预定数量的引用已经被添加到所述标记栈中之后,然后处理所述预定引用中的每一引用并从所述标记栈中弹出所述预定引用中的每一引用,直到所述标记栈中对所述对象本身的引用或基于该引用的条目处在要从所述标记栈读取的位置中。
4.如权利要求3所述的方法,其特征在于,一旦所述标记栈中对所述对象本身的引用或基于该引用的条目处在要从所述标记栈读取的位置中,执行动作(e)以便再次将所述预定数量的引用添加到所述标记栈。
5.如权利要求3所述的方法,其特征在于,还包括:
判定对应于所述对象中的所有引用的条目已经被添加到所述标记栈;以及
结果,从所述标记栈中弹出所述标记栈中对所述对象本身的引用或基于该引用的条目。
6.如权利要求2所述的方法,其特征在于,所述预定次数少于或等于10次。
7.如权利要求1所述的方法,其特征在于,还包括执行动作(e)直到所述标记栈满。
8.如权利要求1所述的方法,其特征在于,所述指针随对所述对象的引用或基于该引用的条目一起被包括在所述标记栈中。
9.如权利要求1所述的方法,其特征在于,访问所述标记栈上对所述对象的引用或基于该引用的条目包括在所述标记栈中设置对应于所述标记栈中对所述对象的引用或基于该引用的条目的标志来指示应该结合对所述对象的引用或基于该引用的条目来引用指针以将来自所述对象的引用添加到所述标记栈。
10.如权利要求9所述的方法,其特征在于,所述标志包括导致基于对所述对象的引用的条目引用奇数引用的、对所述对象的引用的改变。
11.如权利要求1所述的方法,其特征在于,判定应该结合指针使用所述标记栈中对所述对象本身的引用或基于该引用的条目将所述对象中的引用添加到标记栈包括判定所述对象包括引用的数组。
12.如权利要求1所述的方法,其特征在于,判定应该结合指针使用所述标记栈中对所述对象本身的引用或基于该引用的条目将所述对象中的引用添加到标记栈包括判定所述对象包括至少预定数量的可以获得来自给定引用站点的下一引用的引用。
13.一种在包括实现用于回收存储器以供新对象使用的无用信息收集功能的应用程序代码的计算环境中的方法,其中所述无用信息收集功能包括将对象引用压到标记栈上,从而使得所述标记栈上所引用的对象可以被标记以便阻止用于被标记的对象的存储器被回收以供其他对象实例使用,所述方法按照允许对带有大量对象引用的对象所引用的对象的有限数量的引用被添加到所述标记栈的方式来处理所述标记栈上的对对象的引用,所述方法包括:
(a)判定标记栈包括结合指针的使用的、所述标记栈中对对象本身的引用或基于该引用的条目,所述指针用于跟踪所述对象中的哪些引用已经被压到所述标记栈上,所述标记栈被配置成允许标记被压到所述标记栈上的对象来阻止用于所述标记栈上所引用的对象的存储器被回收以供其他对象使用(302);
(b)将来自所述对象的引用压到所述标记栈上(312)
(c)将动作(b)执行预定次数;
(d)递增所述指针(318);
(e)在将动作(b)执行预定次数并执行动作(c)之后,处理并从所述标记栈中弹出引用,直到所述标记栈中对所述对象本身的引用或基于该引用的条目处在要从所述标记栈读取的位置中(320)。
14.如权利要求13所述的方法,其特征在于,还包括在所述标记栈中对所述对象本身的引用处在要从所述标记栈读取的位置中之后,再次将动作(b)执行预定次数并执行动作(c)。
15.如权利要求13所述的方法,其特征在于,还包括:
判定对应于所述对象中的所有引用的条目已经被添加到所述标记栈;以及
结果,从所述标记栈中弹出所述标记栈中对所述对象本身的引用。
16.如权利要求13所述的方法,其特征在于,所述指针随所述标记栈上的引用或基于该引用的条目一起被包括。
17.如权利要求13所述的方法,其特征在于,所述指针被存储在所述标记栈外部,并且一标志与所述标记栈中对对象本身的引用或基于该引用的条目相关联来指示应该引用一外部指针。
18.如权利要求17所述的方法,其特征在于,所述标志包括基于所述标记栈中对对象本身的引用的条目是对奇数地址的引用。
19.一种在包括实现用于回收存储器以供新对象使用的无用信息收集功能的应用程序代码的计算环境中的方法,其中所述无用信息收集功能包括将对象引用压到标记栈上,从而使得所述标记栈上所引用的对象可以被标记以便阻止用于被标记的对象的存储器被回收以供其他对象实例使用,所述方法按照允许对带有大量对象引用的对象所引用的对象的有限数量的引用被添加到所述标记栈的方式将对对象的引用添加到所述标记栈的方法,所述方法包括:
(a)访问对象(302)
(b)判定应该结合指针使用所述标记栈中对所述对象本身的引用或基于该引用的条目来将所述对象中的引用添加到所述标记栈,所述指针用于跟踪所述对象中的哪些引用已经被压到所述标记栈上,所述标记栈被配置成允许标记被压到所述标记栈上的对象来阻止用于所述标记栈上所引用的对象的存储器被回收以供其他对象使用(304)
(c)访问所述标记栈上的对所述对象的引用或基于该引用的条目(306);
(d)初始化指针(308)
(e)将对所述对象所引用的另一对象的引用压到所述标记栈上(312)
(f)在将对另一对象的引用进栈之后,判定更多引用应该被压到所述标记栈,且结果,重复动作(e)(310和316);
(g)更新所述指针(318);
(h)处理来自所述标记栈的引用,直到对所述对象的引用或基于该引用的条目处在要从所述标记栈读取的位置中(320)
(i)在处理来自所述标记栈的引用之后,判定更多的来自所述对象的引用应该被添加到所述标记栈,且结果,重复动作(e)、(f)和(g);
(j)判定不应该再将任何来自所述对象的引用添加到所述标记栈(310和316),且结果,从所述标记栈中弹出所述标记栈中对所述对象本身的引用或基于该引用的条目(322)。
20.如权利要求19所述的方法,其特征在于,所述指针随所述标记栈中对所述对象本身的引用一起被包括在所述标记栈中。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/107,483 | 2008-04-22 | ||
US12/107,483 US7987215B2 (en) | 2008-04-22 | 2008-04-22 | Efficiently marking objects with large reference sets |
PCT/US2009/036419 WO2009131760A2 (en) | 2008-04-22 | 2009-03-06 | Efficiently marking objects with large reference sets |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102016788A true CN102016788A (zh) | 2011-04-13 |
CN102016788B CN102016788B (zh) | 2013-07-17 |
Family
ID=41202020
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009801146883A Active CN102016788B (zh) | 2008-04-22 | 2009-03-06 | 高效地标记带有大引用集的对象 |
Country Status (5)
Country | Link |
---|---|
US (1) | US7987215B2 (zh) |
EP (1) | EP2281233B1 (zh) |
CN (1) | CN102016788B (zh) |
BR (1) | BRPI0909083A2 (zh) |
WO (1) | WO2009131760A2 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104350478A (zh) * | 2012-07-30 | 2015-02-11 | 甲骨文国际公司 | 用于使用位图窗口的持久性存储器中对象删除的系统和方法 |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8335806B2 (en) * | 2010-02-01 | 2012-12-18 | Oracle America, Inc. | Marking algorithm for garbage collection using a rescan map |
US9053017B2 (en) * | 2011-09-09 | 2015-06-09 | Microsoft Technology Licensing, Llc | Managing object lifetime in a cyclic graph |
US10789223B2 (en) | 2016-03-24 | 2020-09-29 | Microsoft Technology Licensing, Llc | Hybrid garbage collection in a distributed storage system |
US9934126B1 (en) | 2017-03-08 | 2018-04-03 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of reverse lookup data structures |
US10185645B2 (en) | 2017-03-08 | 2019-01-22 | Microsoft Technology Licensing, Llc | Resource lifetime analysis using a time-travel trace |
US9983978B1 (en) | 2017-03-08 | 2018-05-29 | Microsoft Technology Licensing, Llc | Querying an indexed time-travel trace |
US9934127B1 (en) | 2017-03-08 | 2018-04-03 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of key frames for replay responsiveness |
US9959194B1 (en) | 2017-03-08 | 2018-05-01 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of memory snapshots for replay responsiveness |
US9940369B1 (en) | 2017-03-08 | 2018-04-10 | Microsoft Technology Licensing, Llc | Searching an indexed time-travel trace |
US10282274B2 (en) | 2017-06-14 | 2019-05-07 | Microsoft Technology Licensing, Llc | Presenting differences between code entity invocations |
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 (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020199065A1 (en) * | 2001-06-20 | 2002-12-26 | Sreenivas Subramoney | Method for using cache prefetch feature to improve garbage collection algorithm |
US20030069905A1 (en) * | 2000-07-31 | 2003-04-10 | Microsoft Corporation | Method and system for concurrent garbage collection |
US20050289307A1 (en) * | 2004-06-24 | 2005-12-29 | International Business Machines Corporation | Method and system for determining memory usage of a heap |
US20070162527A1 (en) * | 2006-01-03 | 2007-07-12 | Wright Gregory M | Method and apparatus for facilitating mark-sweep garbage collection with reference counting |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5088036A (en) * | 1989-01-17 | 1992-02-11 | Digital Equipment Corporation | Real time, concurrent garbage collection system and method |
GB9721659D0 (en) * | 1997-10-14 | 1997-12-10 | Philips Electronics Nv | Space-limited marking structure for tracing garbage collectors |
GB9813266D0 (en) * | 1998-06-20 | 1998-08-19 | Koninkl Philips Electronics Nv | Stored data object marking for garbage collectors |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6453463B1 (en) * | 1999-06-07 | 2002-09-17 | Sun Microsystems, Inc. | Method and apparatus for providing finer marking granularity for fields within objects |
US6874074B1 (en) * | 2000-11-13 | 2005-03-29 | Wind River Systems, Inc. | System and method for memory reclamation |
US6735680B2 (en) * | 2002-05-24 | 2004-05-11 | Sun Microsystems, Inc. | Method and apparatus for deleting objects from memory within a smart card |
US7092978B2 (en) * | 2003-02-24 | 2006-08-15 | Sun Microsystems, Inc. | Space-efficient, depth-first parallel copying collection technique making use of work—stealing on the same structures that maintain the stack of items to be scanned |
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 |
CN101046755B (zh) * | 2006-03-28 | 2011-06-15 | 郭明南 | 一种计算机自动内存管理的系统及方法 |
US7512745B2 (en) * | 2006-04-28 | 2009-03-31 | International Business Machines Corporation | Method for garbage collection in heterogeneous multiprocessor systems |
-
2008
- 2008-04-22 US US12/107,483 patent/US7987215B2/en active Active
-
2009
- 2009-03-06 WO PCT/US2009/036419 patent/WO2009131760A2/en active Application Filing
- 2009-03-06 EP EP09734706A patent/EP2281233B1/en active Active
- 2009-03-06 BR BRPI0909083A patent/BRPI0909083A2/pt not_active IP Right Cessation
- 2009-03-06 CN CN2009801146883A patent/CN102016788B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030069905A1 (en) * | 2000-07-31 | 2003-04-10 | Microsoft Corporation | Method and system for concurrent garbage collection |
US7310655B2 (en) * | 2000-07-31 | 2007-12-18 | Microsoft Corporation | Method and system for concurrent garbage collection |
US20020199065A1 (en) * | 2001-06-20 | 2002-12-26 | Sreenivas Subramoney | Method for using cache prefetch feature to improve garbage collection algorithm |
US20050289307A1 (en) * | 2004-06-24 | 2005-12-29 | International Business Machines Corporation | Method and system for determining memory usage of a heap |
US20070162527A1 (en) * | 2006-01-03 | 2007-07-12 | Wright Gregory M | Method and apparatus for facilitating mark-sweep garbage collection with reference counting |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104350478A (zh) * | 2012-07-30 | 2015-02-11 | 甲骨文国际公司 | 用于使用位图窗口的持久性存储器中对象删除的系统和方法 |
Also Published As
Publication number | Publication date |
---|---|
EP2281233A4 (en) | 2011-09-28 |
WO2009131760A3 (en) | 2009-12-17 |
US20090265402A1 (en) | 2009-10-22 |
WO2009131760A2 (en) | 2009-10-29 |
EP2281233A2 (en) | 2011-02-09 |
CN102016788B (zh) | 2013-07-17 |
BRPI0909083A2 (pt) | 2019-09-24 |
US7987215B2 (en) | 2011-07-26 |
EP2281233B1 (en) | 2013-02-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102016788B (zh) | 高效地标记带有大引用集的对象 | |
EP2115595B1 (en) | Memory device performance enhancement through pre-erase mechanism | |
US8429620B2 (en) | Memory leak diagnosis | |
CN103577335B (zh) | 一种内存垃圾回收系统及方法 | |
CN103370691B (zh) | 管理缓冲器溢出状况 | |
CN103077126B (zh) | 一种内存管理方法和装置 | |
CN103339616A (zh) | 基于区域的垃圾收集器中的递增类卸载 | |
CN104008111A (zh) | 一种数据的存储管理方法及装置 | |
US9003240B2 (en) | Blackbox memory monitoring with a calling context memory map and semantic extraction | |
CN103123604A (zh) | 跟踪数据处理系统的内存使用的方法 | |
CN108829342B (zh) | 一种日志存储方法、系统及存储装置 | |
CN111324450A (zh) | 一种基于lte协议栈的内存池泄露的方法及其系统 | |
CN104350478A (zh) | 用于使用位图窗口的持久性存储器中对象删除的系统和方法 | |
CN103425729B (zh) | 用于管理计算机系统中内存的方法和装置 | |
CN112712702B (zh) | 违法事件去重方法、装置、电子设备及机器可读存储介质 | |
CN103678337A (zh) | 数据清除方法、装置及系统 | |
CN103559098B (zh) | 智能卡测试号码控制方法、装置及系统 | |
CN104850505A (zh) | 基于链式堆叠的内存管理方法与系统 | |
CN105718319A (zh) | 一种内存池版图解析方法和内存池装置 | |
CN100395712C (zh) | 软件系统的资源管理方法 | |
US8176286B2 (en) | Memory recycling in computer systems | |
CN110007860A (zh) | 基于lsm数据库的垃圾处理的方法、固态硬盘以及存储装置 | |
CN107957921B (zh) | 一种均衡磨损的智能卡掉电数据保护方法 | |
CN1695206A (zh) | 检测对持久存储器写错的方法与装置 | |
CN114706871B (zh) | 一种基于综合监控管理的数据监控方法及系统 |
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 | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150427 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20150427 Address after: Washington State Patentee after: Micro soft technique license Co., Ltd Address before: Washington State Patentee before: Microsoft Corp. |