使用类型信息的垃圾回收(Gc)

4

有没有一种GC算法可以利用类型信息来实现增量收集、优化收集、并行收集或其他好的功能呢?

通过类型信息,我指的是真正的语义。让我举个例子:假设我们有一个面向对象的类,其中有维护列表的方法,隐藏了表示方式。当对象变得不可达时,收集器只需运行列表并删除所有节点。它知道它们现在都是不可达的,因为封装。它还知道没有必要对节点进行指针的普通扫描,因为它知道所有节点都是相同类型。

显然,这是一个特殊情况,在C++中很容易处理。真正的问题是是否有一种方法来分析程序中使用的类型,并指导收集器利用所得到的信息。我想你可以称之为“类型导向垃圾收集器”。


1
如果该类有一个get()方法,您可以通过查看活性来静态确定可以删除列表中的所有对/节点,但不能确定实际元素。 - user110763
我对其他使用GC的语言不是很了解,但我认为它们的方法与Java类似:你付出GC的代价来换取不必处理死指针。如果你的GC不是基于实际引用计数,那么你就失去了优势,仍然需要付出代价。然而,我可以想象类型信息驱动启发式算法,决定检查哪个对象的可达性。 - biziclop
我可以想象从类型信息中得出的启发式方法:这是实际的问题,你知道任何实际的启发式方法吗 :) - Yttrill
2个回答

5
至少在某种程度上利用容器进行垃圾回收的想法并不新鲜,但在Java中,您通常不能假定容器仅包含其中的对象引用,因此您的方法在这种情况下不起作用。
以下是一些参考资料。其中一个是用于泄漏检测,另一个(来自我的研究小组)是关于改善缓存局部性的。

http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4814126 http://www.cs.umass.edu/~emery/pubs/06-06.pdf

您可能希望访问Richard Jones的广泛垃圾回收参考文献以获取更多参考资料,或向gc-list的人们提问。


0

我认为这与特定的算法无关。

当GC计算对象关系图时,如果编译器足够好以提取信息,则Collection对象单独负责列表元素的信息隐含地存在于图中。

无论选择哪种GC算法:信息更多地取决于编译器/运行时如何提取此信息。

此外,我建议避免在C和C++中使用GC。由于指针算术、别名和可能指向对象内部(数据成员或数组中的引用),在这些语言中进行准确的垃圾回收非常困难。它们并不是为此而设计的。


关于 C/C++:在我看来,它们是垃圾回收的主要候选对象,因为存在悬空指针问题。但是我的应用程序是一个 C++ 代码生成器,而不是手写的 C++ 代码,所以情况略有不同。 - Yttrill
FYI:使用JudyArray检测内部指针非常便宜,事实上,与检测头指针相比,几乎没有额外的成本。我的方法比Boehm收集器中使用的方法更快。 - Yttrill
2
实际上,您可以通过使用正确的堆组织,在O(1)时间内轻松检测内部指针。有关详细信息,请参阅我的论文:http://www.cs.umass.edu/~emery/pubs/06-28.pdf - EmeryBerger
@Emery:非常有趣的阅读,谢谢。我想我会花一些时间阅读你的论文。 - Matthieu M.
算了,删掉第二条评论吧,我现在明白了(数据页和索引页之间存在一对一的对应关系,因此可以通过将候选指针向右移动n位来获取大小信息)。 - Yttrill
显示剩余2条评论

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