我在垃圾收集中读了很多资源,他们解释了不同的算法。但是,我没有找到任何解释图形对象的表示。
我的想法很简单:一个定向图,其中顶点表示分配的内存块(在堆上),边缘表示所有者关系。示例:考虑2个内存块m1和m2,如果m1包含对m2内的块的引用,则添加边(m1,m2)。这些边用m1包含的m2的引用数加权(这里只是1)。最后,我有一个代表堆栈的“虚拟”内存顶点,称之为M0。从M0可以到达的每个Mi都不能被垃圾收集。
好的,现在考虑要为图表添加一个内存块。如果我们将顶点保留在集合中,那么添加内存块的复杂性应为O(log(n))。 第一个问题:我们可以做得更好吗?
同意删除。
现在,我被要求在C ++(shared_ptr)中使用此算法和引用计数机制。首先,参考计数器是否与顶点的入度无冗余?
其次,关键的想法是使用最好的参考计数器(O(1)删除/添加)与最好的垃圾收集器算法(清理参考周期),但是添加/删除每个节点的开销在对象图中是不是有点无效?
在已知的垃圾收集器(java / C#/ ...)中添加/删除有哪些复杂性?
谢谢!
答案 0 :(得分:2)
嗯......你的前提是关闭的。已知的垃圾收集器实际上并没有保持很多状态,每个对象最多只有几个位和一些结构,但就是这样。相反,他们在每个收集过程中建立一些状态,并在传递结束时让它死掉。这样,他们几乎不需要(甚至没有)所有权关系的工具。