如果一个对象有5个引用,那么该对象可以找出引用他的内容吗?
因为我知道Java(并且希望C#
)有一个GC列表。
答案 0 :(得分:8)
不,没有“参考列表”。 GC不需要知道引用对象的所有内容 - 它只需要知道任何是否引用了对象。
作为GC的一个非常粗略的模型,它将堆中的每个对象标记为垃圾,然后查看知道的对象是非垃圾(“根”对象)。例如,它将查看每个线程的堆栈以及线程中的每个实例方法,通常 1 将目标实例标记为非垃圾。
然后它将遍历每个根,并查看那些引用的对象...并将它们标记为非垃圾。它会逐渐减速,找到它能做的一切。然后可以收集(或最终确定)未被标记为非垃圾的任何东西。
从这个算法中可以看出,GC不需要为每个对象保留完整的引用列表 - 只需要说“垃圾”或“非垃圾”。
显然,实际上GC在Java和.NET中要复杂得多,使用世代垃圾收集器和各种策略来最小化GC“暂停”并为GC使用多个线程。希望这个简化的视图足以解释为什么即使GC也没有参考列表。
1 对于.NET,并非总是如此。当一个实例方法仍然在“in”中运行时,对象可以进行垃圾收集,如果该方法从当前点开始不引用对象中的任何字段。
答案 1 :(得分:0)
如果您未能找到对此的语言支持,只需让每个想要保存对相关对象的引用的对象调用一个方法,该方法告诉相关对象它正被引用。然后,此对象将引用对象添加到列表中。每当您放弃对该对象的引用时,都会调用另一个方法来从列表中删除引用者。