2017-06-16 24 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'。我認爲你的操作意味着在列表上進行修改。謝謝! –

相關問題