虚拟机垃圾收集

时间:2016-01-25 11:56:41

标签: compiler-construction garbage-collection vm-implementation

我最近一直在阅读(基于堆栈的)虚拟机。我无法找到一个好的答案是:

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

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

  1. 在语言层面实施GC。
  2. 在VM级别实施GC。这意味着要求请求内存/对象的特殊指令。然后,VM将根据对象的引用来管理这些对象的生命周期。
  3. 这些都是有效的选择吗?如果是这样,通常在某些情况下使用哪一个?

1 个答案:

答案 0 :(得分:3)

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

在某些语言中,例如C,C ++(请参阅Boehm GC)和Rust(请参阅rust-gc),GC实现为库。在其他语言中,例如C#(请参阅CoreCLRMono),Java和Ruby(请参阅their repo),它在运行时环境中实现。

我确信还有更多的例子,也可能是反例,但我相信至少可以对哪些因素在决策中发挥作用进行一些观察:

  • 对于要在语言级别编写的GC,它必须以某种方式可选(即使默认情况下处于打开状态)。毕竟,GC需要为自己正确的操作分配内存 - 因此,它必须使用至少在没有GC的情况下可用的语言编写。
  • GC是内存管理器,因此它存在并且可能在该语言的几乎每个程序的操作期间经常使用 - 因此,它可以合理地被认为是性能关键的代码段。虽然没有硬性规则说基于VM的语言实现效率必然低于本机编译的实现,但实际上,基于VM的实现有些落后。