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

Garbage collector : data structure of the object graph

本文关键字:数据结构 对象图 收集器      更新时间:2023-10-16

我读了很多关于垃圾收集的资料,他们解释了不同的算法。然而,我没有找到任何解释图形对象的表示。

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

好了,现在考虑你想给图添加一个内存块。如果我们将顶点保持在一个集合内,那么添加内存块的复杂度应该是O(log(n))。第一个问题:我们能做得更好吗?

删除标识符

现在,我被要求将这个算法与c++中的引用计数机制(shared_ptr)一起使用。首先,参考计数器是否与顶点的in度无关?

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

添加/删除已知垃圾收集器(java/c#/…)的复杂性是什么?

谢谢!

嗯…你的前提错了。已知的垃圾收集器实际上并不维护太多的状态,每个对象最多维护几个和一些结构,但仅此而已。相反,它们在每次收集传递时建立一些状态,并让它在传递结束时消失。这样,他们几乎不需要(甚至不需要)所有权关系的工具。