我该如何进行垃圾回收实验?

10

我对垃圾回收的工作方式很感兴趣。我已经阅读了一些关于标记-清除、停止-复制、分代GC等工作原理的内容...我想尝试实现其中的一些并比较它们的行为。有什么好的方法可以开始自己的实验吗?最好是用C、Java或Python来实现(虽然后两者本身就带有垃圾回收,所以似乎很难使用它们...)

7个回答

14

我自己没有玩过,但在使用C/C++时经常被提到的是Hans Boehm's


只是补充一下,如果你想在C/C++中保持,而不使用虚拟机,那么这被认为是首选的垃圾收集器... - Remo.D
+1,当我在处理极其复杂的任务时,如果出现双重free(),后果将不堪设想,因此我经常使用它。 - Tim Post
没错,这也是gcc项目正在使用的GC。 - none

2

现在,.NET运行时和Java运行时都是开源的,因此如果您想玩弄当前支持的编程语言,可以尝试对运行时进行实验。但是,如果你想自己做这件事,你可能需要创建自己的运行时,并使用它自己的语言。


1

那个链接已经损坏了。它可能应该是http://docs.parrot.org/parrot/latest/html/docs/pdds/pdd09_gc.pod.html。 - DarenW

0

实现你自己的JVM。不需要花哨的功能,只需基础知识。有很多程序/编译器/语言可以生成JVM代码,所以你有足够的材料进行测试。


0

玩起来很有趣,但垃圾回收是黑魔法。不仅让它工作,还要让它与最新的虚拟机一样高效地工作。

我们谈论的是多阶段和魔法,使分配速度更接近于堆栈分配而不是 malloc。

整个伊甸园概念非常棒。

你可能想阅读一些关于所使用技术的白皮书。

这里有一篇文章,似乎有一个很好的概述(只是从快速谷歌/扫描中)。

http://www.devx.com/Java/Article/21977/0/page/1


“垃圾回收是黑魔法”这样的说法我觉得有些不利于生产力,因为你其实可以用100行代码写出一个不错的垃圾回收器。 - J D
1
@Jon Harrop 做一个简单的GC很容易(正如我在我的回答中所说),让它与新VM的效率相匹配是一种黑暗的艺术。你真的不同意吗?你有研究过新VM的工作原理吗? - Bill K
1
@Jon,我也不是在谈论并发——那并不特别难。我说的是多代GC,其中Eden被填充、复制和重新填充以反映新对象的短生命周期,长期存在的对象被提升到更长期的存储区域,并最终可能被移动到“旧”代中,在那里它们不太可能被移动或通过分析使用模式进行更改。如果你能用几百行代码实现这个功能,或者可以诚实地称之为任何东西而不是黑魔法(由于需要多年的试错调整/分析),我会非常印象深刻。 - Bill K
@Bill:虚拟机设计实际上是我的一项爱好。我已经阅读了数百篇研究论文,甚至实现了自己的虚拟机(HLVM)。我担心很多人会因为认为这是一种“黑暗艺术”而被吓到,但事实上,如今你可以轻松地自己创建一个具有竞争性能的虚拟机。现在有很多优秀的文献可供参考... - J D
@Bill:传统的代际收集也不必太难。首先,它需要一个移动收集器,因此您必须在GC安全点保存和重新加载所有本地持有的引用。其次,您可以使用指针增量分配到大约与L2缓存大小相同的幼年代中。当它满了时,您遍历它并将所有可达值复制到旧代中(您可以使用mallocfree来管理旧代),并通过重置指针在O(1)中扫描整个幼年代(这就是为什么当高比例的值短命时速度如此快)。 - J D
显示剩余2条评论

0

0

MMTk 包含一系列高性能垃圾收集器,其中包括:

  • 复制收集器
  • 跟踪收集器
  • 引用计数收集器

它还具有以下特点:

  • 停顿式收集器
  • 并发收集器

由于它是一个研究平台,因此还有一些先进的收集器,如代际引用计数收集器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接