跟踪引用的垃圾收集状态制造技术

技术编号:38705780 阅读:9 留言:0更新日期:2023-09-08 14:46
垃圾收集(GC)状态被存储在存储在堆存储器上的引用内,以跟踪相对于引用的GC操作的进度。GC状态可以被存储在引用的不可寻址部分中。基于特定引用的GC状态,为该引用选择并执行一组GC操作。然而,存储在调用堆栈上的引用不包括GC状态的任何指示。因此,将引用从堆加载到调用堆栈涉及移除GC状态的指示。将引用写入到堆涉及添加GC状态的指示。嵌入在已编译方法内的引用也不指示任何GC状态。已编译方法的元数据指示GC状态,其隐含到嵌入的引用。基于已编译方法的GC状态,为每个嵌入的引用选择和执行GC操作。执行GC操作。执行GC操作。

【技术实现步骤摘要】
【国外来华专利技术】跟踪引用的垃圾收集状态


[0001]本公开涉及垃圾收集。具体地,本公开涉及跟踪引用(reference)的垃圾收集状态。

技术介绍

[0002]编译器将根据旨在方便程序员的规范所编写的源代码转换成机器代码(也称为“本机(native)代码”或“目标代码”)。机器代码可直接由物理机器环境执行。附加地或替代地,编译器将源代码转换成中间表示(也称为“虚拟机代码/指令”),诸如字节码,其可由能够在各种物理机器环境之上运行的虚拟机执行。虚拟机指令可由虚拟机以比源代码更直接和更高效的方式执行。将源代码转换成虚拟机指令包括根据规范将源代码功能映射到虚拟机功能,这利用了虚拟机的底层资源(诸如数据结构)。通常,程序员经由源代码以简单术语呈现的功能被转换成更复杂的步骤,这些步骤更直接地映射到虚拟机所在的底层硬件所支持的指令集。
[0003]虚拟机通过执行源代码的中间表示(诸如字节码)来执行应用和/或程序。虚拟机的解释器将中间表示转换成机器代码。在执行应用时,会为程序所创建的对象分配一定的存储器(也称为“堆存储器(heap memory)”)。垃圾收集系统可以被用于自动地回收(reclaim)应用不再使用的对象所占用的存储器位置。垃圾收集系统使程序员不必明确指定要释放的对象。然而,应用在等待垃圾收集操作完成时经常需要暂停。减少这些暂停时间的一种方法是使用至少在垃圾收集周期的一些阶段支持并发垃圾收集操作的垃圾收集器。应用只需要在非并发(non

concurrent)垃圾收集操作期间暂停,但可以在并发垃圾收集操作期间并发地运行(包括在必要时继续分配新对象)。
[0004]在本部分中描述的方法是可以实行的方法,但不一定是先前已经构想或实行的方法。因此,除非另外指出,否则不应当假设在本部分中描述的任何方法仅仅因为其包括在本部分中就被认为是现有技术。
附图说明
[0005]在附图的各个图中,实施例是作为示例而不是作为限制进行图示的。应当注意的是,在本公开中对“一个”实施例的引用不一定是指相同的实施例,并且它们意味着至少一个。在附图中:
[0006]图1图示了在其中可以实践本文描述的技术的示例计算体系架构。
[0007]图2是图示适合于实现本文描述的方法和特征的计算机系统的一个实施例的框图。
[0008]图3图示了根据实施例的以框图形式的示例虚拟机存储器布局。
[0009]图4图示了根据实施例的以框图形式的示例帧。
[0010]图5图示了根据实施例的虚拟机的执行引擎和堆存储器。
[0011]图6图示了根据实施例的堆引用(heap reference)和可解除引用的引用
(dereferencable reference)。
[0012]图7图示了根据实施例的垃圾收集周期。
[0013]图8A

图8D图示了根据实施例的垃圾收集处理。
[0014]图9图示了根据实施例的多个垃圾收集周期和对应的良好垃圾收集状态(或“良好颜色”)。
[0015]图10图示了根据实施例的引用加载屏障(reference load barrier)。
[0016]图11图示了根据实施例的引用写入屏障(reference write barrier)。
[0017]图12图示了根据实施例的已编译方法加载屏障(compiled method load barrier)。
[0018]图13图示了根据实施例的用于由垃圾收集线程标记(mark)堆引用的一组操作。
[0019]图14图示了根据实施例的用于由应用线程加载堆引用的一组操作。
[0020]图15图示了根据实施例的用于将堆引用从当前垃圾收集状态带入良好垃圾收集状态的一组路径。
[0021]图16图示了根据实施例的用于由应用线程写入堆引用的一组操作。
[0022]图17图示了根据实施例的用于由应用线程加载已编译方法(compiled method)的一组操作。
[0023]图18图示了根据实施例的用于将嵌入的引用(embedded reference)从当前垃圾收集状态带入良好垃圾收集状态的一组路径。
[0024]图19图示了根据一个或多个实施例的系统。
具体实施方式
[0025]在以下描述中,为了解释的目的,阐述了许多具体细节以便提供透彻的理解。可以在没有这些具体细节的情况下实践一个或多个实施例。在一个实施例中描述的特征可以与在不同实施例中描述的特征组合。在一些示例中,参考框图形式来描述众所周知的结构和设备,以便避免不必要地模糊本专利技术。
[0026]1.总体概述
[0027]2.体系架构概述
[0028]2.1示例类文件结构
[0029]2.2示例虚拟机体系架构
[0030]2.3加载、链接和初始化
[0031]3.垃圾收集
[0032]4.加载和写入屏障
[0033]5.通过垃圾收集线程标记堆引用
[0034]6.通过应用线程加载堆引用
[0035]7.通过应用线程写入堆引用
[0036]8.通过应用线程加载已编译方法
[0037]9.其它方面;扩展
[0038]10.硬件概述
[0039]1.总体概述
[0040]一个或多个实施例包括基于垃圾收集状态(也称为“颜色”)执行垃圾收集,垃圾收集状态(a)与堆引用一起存储但(b)不与可以被用于作为应用执行的一部分访问底层对象的引用一起存储。一组垃圾收集(GC)状态被用于跟踪相对于堆引用的GC操作的进度。堆引用包括与堆引用相关联的当前GC状态的指示。基于当前GC状态和当前GC周期的当前阶段,某些GC操作被选择来处理该堆引用。同时,可以被用于作为应用执行的一部分访问底层对象的引用(也称为“可解除引用的引用”)不包括该组GC状态中的任何GC状态的任何指示。这种可解除引用的引用包括例如存储在调用堆栈(call stack)中的引用,以及嵌入在被存储在代码高速缓存(code cache)中的已编译方法(compiled method)中的引用。因此,堆存储器中的引用指示一组GC状态中的一个状态与堆引用相关联;但是存储在调用堆栈中的指向同一对象的引用不包括该组GC状态中的任何状态的任何指示。此外,堆存储器中的引用指示一组GC状态中的一个状态与堆引用相关联;但是嵌入在存储在代码高速缓存中的已编译方法中的引用不包括该组GC状态中的任何状态的任何指示。
[0041]一个或多个实施例包括在将引用从堆存储器加载到调用堆栈时实现引用加载屏障。可以与GC线程并发运行的应用线程请求将引用从堆存储器加载到调用堆栈上。该堆引用包括该堆引用的当前GC状态的指示。执行检查以确定当前GC状态相对于当前GC周期的当前阶段是否为“良好”。如果当前GC状态不为良好,那么执行一组GC操作以使堆引用从当前GC状态变为良好GC状态。该堆引用被更新以将良好GC状态指示为当前GC状态。然而,在本文档来自技高网
...

【技术保护点】

【技术特征摘要】
【国外来华专利技术】1.一种或多种非暂态机器可读介质,所述非暂态机器可读介质存储指令,所述指令在由一个或多个处理器执行时,使得:由应用线程接收用于将对第一对象的第一引用从堆存储器加载到所述应用线程的调用堆栈上的请求;从所述堆存储器中检索第一引用,其中第一引用包括(a)第一对象在至少第一时间段期间在所述堆存储器中被存储的第一存储器地址,以及(b)多个垃圾收集状态中与第一引用相关联的第一垃圾收集状态的指示;其中,所述多个垃圾收集状态中的相应垃圾收集状态指示相对于存储在所述堆存储器中的多个引用中的每个引用的垃圾收集操作的进度;至少通过从第一引用中移除第一垃圾收集状态的指示来从第一引用生成第二引用;将第二引用存储到所述调用堆栈上,而没有所述多个垃圾收集状态中的任何垃圾收集状态的任何指示。2.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:基于与第一引用相关联的第一垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径;其中,所述多个路径中的至少一个路径包括更新第一引用以指示所述多个垃圾收集状态中的第二垃圾收集状态与第一引用相关联。3.如权利要求2所述的一种或多种介质,其中,所述多个路径中的至少一个其它路径不包括对第一引用进行任何改变以指示所述多个垃圾收集状态中的不同垃圾收集状态与第一引用相关联。4.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:更新第一引用以指示所述多个垃圾收集状态中的第二垃圾收集状态与第一引用相关联;在更新第一引用之后:由所述应用线程接收用于将来自第一对象的第一引用从所述堆存储器加载到所述应用线程的所述调用堆栈上的第二请求;基于与第一引用相关联的第二垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径。5.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:更新第一引用以指示所述多个垃圾收集状态中的第二垃圾收集状态与第一引用相关联;在更新第一引用之后:由垃圾收集线程识别第一引用;基于与第一引用相关联的第二垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径;其中,所述多个路径中的至少一个路径包括更新第一引用以指示第一垃圾收集状态与第一引用相关联。6.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:基于与第一引用相关联的第一垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径;其中,所述多个路径中的至少一个路径包括重新映射第一引用以用第一对象在至少第
二时间段期间在所述堆存储器中被存储的第二存储器地址来替换第一存储器地址。7.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:基于与第一引用相关联的第一垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径;其中,所述多个路径中的至少一个路径包括将第一对象标记为存活。8.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:基于由垃圾收集线程执行的当前垃圾收集周期的当前阶段,确定所述多个垃圾收集状态中的良好垃圾收集状态;基于所述良好垃圾收集状态和与第一引用相关联的第一垃圾收集状态:从多个路径中选择要相对于第一引用执行的路径;相对于第一引用执行所选择的路径。9.如权利要求1所述的一种或多种介质,其中,第二引用包括以下之一:第一对象在至少第一时间段期间在所述堆存储器中被存储的第一存储器地址;或者第一对象在至少第二时间段期间在所述堆存储器中被存储的第二存储器地址,而不是第一存储器地址。10.如权利要求1所述的一种或多种介质,其中,与第一引用相关联的第一垃圾收集状态的指示被存储在第一引用的不可寻址部分中。11.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:对第二引用解除引用。12.如权利要求1所述的一种或多种介质,还存储指令,所述指令使得:在对第二引用解除引用之前:验证第二引用符合规范形式;其中,包括第一垃圾收集状态的指示的第一引用不符合所述规范形式。13.如权利要求1所述的一种或多种介质,其中,第一引用内的第一组位包括与第一引用相关联的第一垃圾收集状态的指示,并且第二引用的相同的第一组位包括第二引用的可寻址部分的符号扩展。14.一种或多种非暂态机器可读介质,所述非暂态机器可读介质存储指令,所述指令在由一个或多个处理器执行时,使得:由应用线程识别用于将第一引用写入到堆存储器上的请求;确定多个垃圾收集状态中与由垃圾收集线程执行的垃圾收集周期的当前阶段相关联的第一垃圾收集状态;其中...

【专利技术属性】
技术研发人员:E
申请(专利权)人:甲骨文国际公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1