虚拟机垃圾回收

virtual machine garbage collection

我最近一直在研究(基于堆栈的)虚拟机。以下是我找不到好的答案的原因:

垃圾收集器通常在什么级别实现?

考虑到这一点,我想到了以下两个选项:

  1. 在语言级别实施 GC。
  2. 在 VM 级别实施 GC。这意味着有关于请求 memory/objects 的特殊说明。然后,这些对象的生命周期将由 VM 根据对对象的引用进行管理。

这两个选项都有效吗?如果是这样,哪一种通常用于某些情况?

这两个选项都可用,但这取决于语言和您的目标。

在某些语言中,例如C、C++(参见Boehm GC) and Rust (see rust-gc), the GC is implemented as a library. In other languages, such as C# (see CoreCLR and Mono), Java and Ruby (see their repo),它是在运行时环境中实现的。

我相信还有更多示例,也可能 counter-examples,但我相信至少可以就哪些因素在决策中发挥作用进行一些观察:

  • 对于在语言级别编写的 GC,它必须在某种程度上是可选的(即使它默认打开)。毕竟,GC 需要为自己的正确操作分配内存 - 因此,它必须使用至少在没有 GC 的情况下可用的语言编写。
  • GC 是内存管理器,因此它存在并且可能在该语言的几乎每个程序的运行过程中经常使用 - 因此,可以合理地将其视为一段 performance-critical 代码。虽然没有硬性规定说 VM-based 语言实现的效率必然低于本地编译的实现,但实际上,VM-based 实现有些落后。