2017-06-16 28 views
1

如果我有一个List[HugeObjects]与许多元素,我只需迭代一次,并没有对它做任何操作(例如追加,预先等等),是否有意义,我将List转换为Iterator,所以当我迭代它的元素将得到删除和更多的内存将可用(因为GC会照顾他们在某些时候)?从内存的角度将列表转换为迭代器是否有意义?

+0

我很想知道为什么问题得到了降低。这是一个关于JVM GC行为的问题,特别是在Scala中,我找不到任何类似的问题,可以为我提供关于如何管理这些问题的见解。 –

回答

1

我预计答案是“不,迭代器保持对列表的引用,所以只要使用迭代器,什么都不会被垃圾收集。”

但看实际执行(https://github.com/scala/scala/blob/v2.12.2/src/library/scala/collection/LinearSeqLike.scala#L41)之后,事实证明它没有:有哪些特别提到不是“防止[和]由垃圾收集原始序列”一个评论,

List("a").iterator.getClass().getDeclaredFields() 

确认these是唯一的字段,因此没有隐藏的参考。

但是!您不会说在List上要执行的操作是什么,但是如果您可以转换为迭代器,那么List代码也可能失去对列表开头的引用,并且垃圾收集器可以收集它:When is a Java local variable eligible for GC?。有可能是由斯卡拉生成的代码会阻止这种优化的一些差异,但我不会这么期待。

+0

我实际上提到我不执行任何操作,只是迭代它。我认为GC会收集列表,因为它被转换为迭代器,但是GC会收集消耗的项目,即使我没有消耗整个迭代器? –

+0

“只是迭代”(你是指'for'还是'foreach'?)也是一种操作。当然,如果这些项目的唯一参考来自列表,它们将被收集(一旦GC开始)。 –

+0

我会做'foreach'。我认为你的操作意味着在列表上进行修改。谢谢! –

相关问题