看起来确实有些奇怪。可能是因为它明确地拆除了列表,是为了清除现有迭代器和子列表以及父列表的列表。
当然,不能加快垃圾收集的速度。垃圾收集器不会遍历不可访问对象中的引用,因此将其为null不会有任何区别。
更新
该方法的更新版本具有以下注释:
// Clearing all of the links between nodes is "unnecessary", but:// - helps a generational GC if the discarded nodes inhabit// more than one generation// - is sure to free memory even if there is a reachable Iterator
因此,看来GC至少在某些情况下是有好处的。
假设
Node年龄较大的a 中包含对年龄较小的对象(例如a
Node或元素)的引用。当收集年轻一代时,该引用成为“根”,即使年轻一代
Node无法访问,也导致保留了年轻一代对象。这种状态一直持续到收集到较老的一代为止。老一辈人很少被收集。
如果遍历列表并将其拆除,则包含旧->新引用的变量将分配给
null。该分配的写屏障导致(立即或在GC时)原始引用不再是“根”。这样,现在就可以收集年轻一代中的对象了,并且它最终不会“持久化”到老一代中(这带来了需要收集该一代的时间)。
据推测,GC的收益要比取消选择清单的成本要高得多……无论是在平均水平上还是在成本不菲的情况下。
有关更多信息,请参阅Jones和Lins的“用于动态内存管理的垃圾收集算法”。这是我(第一版)副本中的第7.5章。
一般而言,将
Collection对象扔掉并重新开始比清除对象再使用更好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)