Compiler construction 何时检查是否需要GC?

Compiler construction 何时检查是否需要GC?,compiler-construction,garbage-collection,Compiler Construction,Garbage Collection,我正在为垃圾收集语言编写一个编译器,对于如何知道何时应该运行垃圾收集程序感到困惑 我可以想到两种方法: 在每次堆分配之前进行GC检查。因此,如果任何分配即将失败,我们将运行GC 要“定期”运行GC检查,并在空间“危险”不足时执行GC扫描 我目前使用的是第二种方案,因此我在每个函数项的开头都有一个GC检查,以确保GC检查执行得足够频繁 有人知道我在哪里可以找到关于这个主题的更多信息吗?对于你的问题“有人知道我在哪里可以找到关于这个主题的更多信息吗?”最好的参考是@Raymond Chen 要了解现

我正在为垃圾收集语言编写一个编译器,对于如何知道何时应该运行垃圾收集程序感到困惑

我可以想到两种方法:

  • 在每次堆分配之前进行GC检查。因此,如果任何分配即将失败,我们将运行GC

  • 要“定期”运行GC检查,并在空间“危险”不足时执行GC扫描

  • 我目前使用的是第二种方案,因此我在每个函数项的开头都有一个GC检查,以确保GC检查执行得足够频繁

    有人知道我在哪里可以找到关于这个主题的更多信息吗?

    对于你的问题“有人知道我在哪里可以找到关于这个主题的更多信息吗?”最好的参考是@Raymond Chen

    要了解现有垃圾回收器算法的概述,请检查以下内容

    在你提到的(1)和(2)两种方法中,我觉得必须在两种方法中进行检查

    假设您已使用某些约束定义了堆(主要约束为
    size\t maximumSize、base、limit、NoOfBytesAllocated
    )。因此,在堆结构中再添加几个字段,如
    limitForGcInSizeMinor、limitForGcInSizeMajor limitForGcInObjects
    ,可以更好地处理GC情况(如果堆结构中已经有此字段,请忽略)

    因此,每当分配>=limitForGcInSizeMinor或执行GcMinor时(可以是停止世界机制,也可以是并发的)。如果分配达到limitForGcInSizeMajor,则执行GCMajor(类似于停止世界)。 划分GCMinor和GCMajor的主要原因是将GC峰值(当停止世界机制发生时)的影响降至最低

    所以在GC中,我们一直遵循(2)的方法,我的意思是周期性的,以及使用堆分配来检查它。我从CMS算法中借用了它

    对于你的问题“有人知道我在哪里可以找到关于这个主题的更多信息吗?”最好的参考是@Raymond Chen

    要了解现有垃圾回收器算法的概述,请检查以下内容

    在你提到的(1)和(2)两种方法中,我觉得必须在两种方法中进行检查

    假设您已使用某些约束定义了堆(主要约束为
    size\t maximumSize、base、limit、NoOfBytesAllocated
    )。因此,在堆结构中再添加几个字段,如
    limitForGcInSizeMinor、limitForGcInSizeMajor limitForGcInObjects
    ,可以更好地处理GC情况(如果堆结构中已经有此字段,请忽略)

    因此,每当分配>=limitForGcInSizeMinor或执行GcMinor时(可以是停止世界机制,也可以是并发的)。如果分配达到limitForGcInSizeMajor,则执行GCMajor(类似于停止世界)。 划分GCMinor和GCMajor的主要原因是将GC峰值(当停止世界机制发生时)的影响降至最低


    所以在GC中,我们一直遵循(2)的方法,我的意思是周期性的,以及使用堆分配来检查它。我从CMS算法中借用了它

    通常,GC语言中的内存分配是通过简单地增加指针来完成的。如果指针的增量超过堆的末尾,则是执行GC的时候了。如果您想了解GC实现,这是一个非常好的方法。感谢您提供了简短而清晰的答案。这份调查报告也很有帮助。一般来说,GC语言中的内存分配是通过简单地增加指针来完成的。如果指针的增量超过堆的末尾,则是执行GC的时候了。如果您想了解GC实现,这是一个非常好的方法。感谢您提供了简短而清晰的答案。这份调查报告也很有帮助。