垃圾收集器:对象图的数据结构

时间:2013-04-07 14:22:38

标签: c++ data-structures graph garbage-collection

我在垃圾收集中读了很多资源,他们解释了不同的算法。但是,我没有找到任何解释图形对象的表示。

我的想法很简单:一个定向图,其中顶点表示分配的内存块(在堆上),边缘表示所有者关系。示例:考虑2个内存块m1和m2,如果m1包含对m2内的块的引用,则添加边(m1,m2)。这些边用m1包含的m2的引用数加权(这里只是1)。最后,我有一个代表堆栈的“虚拟”内存顶点,称之为M0。从M0可以到达的每个Mi都不能被垃圾收集。

好的,现在考虑要为图表添加一个内存块。如果我们将顶点保留在集合中,那么添加内存块的复杂性应为O(log(n))。 第一个问题:我们可以做得更好吗?

同意删除。

现在,我被要求在C ++(shared_ptr)中使用此算法和引用计数机制。首先,参考计数器是否与顶点的入度无冗余?

其次,关键的想法是使用最好的参考计数器(O(1)删除/添加)与最好的垃圾收集器算法(清理参考周期),但是添加/删除每个节点的开销在对象图中是不是有点无效?

在已知的垃圾收集器(java / C#/ ...)中添加/删除有哪些复杂性?

谢谢!

1 个答案:

答案 0 :(得分:2)

嗯......你的前提是关闭的。已知的垃圾收集器实际上并没有保持很多状态,每个对象最多只有几个和一些结构,但就是这样。相反,他们在每个收集过程中建立一些状态,并在传递结束时让它死掉。这样,他们几乎不需要(甚至没有)所有权关系的工具。