2010-06-26 45 views

回答

8

不,没有“参考文献列表”。 GC不需要知道引用对象的所有内容 - 它只需知道是否引用任何对象。

作为GC的一个非常粗糙的模型,它将堆中的每个对象都标记为垃圾,然后查看它认为是非垃圾(“根”对象)的对象。例如,它会查看每个线程的堆栈以及线程中的每个实例方法,它通常会将目标实例标记为非垃圾文件。

然后它会经过每个根,看看哪些对象那些那些指的是...并将它们标记为非垃圾。它会缓解下来,找到它所能做的一切。然后可以收集(或确定)任何未被标记为非垃圾的东西。

从这个算法中可以看出,GC不需要为每个对象保留一个完整的引用列表 - 只是说一些“垃圾”或“非垃圾”。

很显然,在Java和.NET中,GC比这个复杂得多,世代垃圾回收器和各种策略可以最大限度地减少GC“暂停”并为GC使用多线程。希望这个简化的视图足以解释为什么甚至GC也没有引用列表。


并不总是,在.NET的情况下。一个对象可以被垃圾回收,而实例方法仍然在“运行”它,如果该方法没有引用从当前点向前的对象中的任何字段。

0

如果您无法为此找到语言支持,只需让每个想要持有对所讨论对象的引用的对象都调用一个方法,告诉正在引用的对象。然后该对象将引用对象添加到列表中。每当您放弃对该对象的引用时,就会调用另一种方法从列表中删除引用者。

+1

很快就会变成病毒......因为现在一个对象需要知道什么时候它将被垃圾收集,以便它可以自行移除。你要么终结一切都有终结者,要么到处都有大量的代码来执行家务管理。 – 2010-06-26 07:14:16

+0

多数民众赞成在即时尝试避免! 这是要变得沉重! 与他们之间的一些链接im计划与10000对象和期望的模型。 如果生病只是在他们的名单上,它可以是一个100000的开销到一个密尔参考 – kalix 2010-06-26 07:18:45

+0

@kalix:那么你应该重新设计,以便你不需要知道“父母”。 – 2010-06-26 07:26:44