gpt4 book ai didi

compiler-construction - 编译语言中的垃圾收集实现

转载 作者:行者123 更新时间:2023-12-03 22:33:58 25 4
gpt4 key购买 nike

在实现精确的垃圾收集时,总是有问题要弄清楚堆栈上哪些字是指针,哪些是其他类型的数据,例如整数或浮点数。解释型语言通常通过将所有内容都设为指针来解决这个问题。某些语言(如 Lisp)的编译器通常通过使用标记位来区分指针和整数来解决它。

但是对于支持完整未装箱机器字整数和浮点数的 Java 和 C# 等语言的 JIT 编译器呢?它们如何判断堆栈和 CPU 寄存器的哪些内容是指针?

最佳答案

此类语言的字节码始终包含完整的类型信息。它存储在元数据中(例如,对于参数类型)或隐式存储在操作码中(例如,可能存在用于添加整数或浮点数的不同操作码)。

在优化代码时,编译器可以访问此信息并使用它来改进优化。它还使用这些信息为特定 GC 安全点的编译代码生成元数据。

GC 安全点是代码中的一个地方,可以安全地中断一个线程以调度另一个线程或执行垃圾回收。在 GC 安全点,我们有必要的元数据可用于找出哪些寄存器包含指针,哪些不包含。例如,在 Hotspot JVM 中,循环总是包含对内存中特殊位置的读取。该读取的结果未使用,但如果指令读取的地址受读保护,则会发生页面错误。这可用于通过简单地将该页面设置为只读来在任意时间点中断线程。一旦线程被中断,我们就会查看程序计数器并在哈希表中查找元数据。

其他需要成为 GC 安全点的地方是分配站点:分配可能会失败并导致 GC 发生。您可以通过一次为多个对象分配内存来减少安全点的数量。

编辑:请注意,使用 GC 安全点只是众多选项之一。正如 SK-logic 提到的,另一种选择是为指针和非指针使用单独的堆栈。很明显,在 GC 期间需要遍历一个堆栈的所有元素,但不需要遍历其他任何元素。但是,您仍然必须小心寄存器中的指针。例如,只要寄存器中有活指针,堆栈中也必须存在相同的指针。

第三种选择是使用影子堆栈,其中包含指向位于真实堆栈上的堆栈根的指针链接列表。详情见论文"Accurate Garbage Collection in an Uncooperative Environment" by Fergus Henderson (PDF) .

关于compiler-construction - 编译语言中的垃圾收集实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com