如果我有一個List[HugeObjects]
與許多元素,我只需迭代一次,並沒有對它做任何操作(例如追加,預先等等),是否有意義,我將List
轉換爲Iterator
,所以當我迭代它的元素將得到刪除和更多的內存將可用(因爲GC會照顧他們在某些時候)?從內存的角度將列表轉換爲迭代器是否有意義?
回答
我預計答案是「不,迭代器保持對列表的引用,所以只要使用迭代器,什麼都不會被垃圾收集。」
但看實際執行(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?。有可能是由斯卡拉生成的代碼會阻止這種優化的一些差異,但我不會這麼期待。
我實際上提到我不執行任何操作,只是迭代它。我認爲GC會收集列表,因爲它被轉換爲迭代器,但是GC會收集消耗的項目,即使我沒有消耗整個迭代器? –
「只是迭代」(你是指'for'還是'foreach'?)也是一種操作。當然,如果這些項目的唯一參考來自列表,它們將被收集(一旦GC開始)。 –
我會做'foreach'。我認爲你的操作意味着在列表上進行修改。謝謝! –
- 1. 是否可以將列表類型轉換爲生成器而無需迭代?
- 2. 如何將列表STL的迭代器轉換爲實例(C++)
- 3. 將迭代器代碼轉換爲流
- 4. 使用對象散列代碼作爲內存緩存鍵是否有意義?
- 5. c#悖論:將列表轉換爲數組迭代更有效?
- 6. 將dc.js轉換爲React是否有意義?
- 7. 將rend迭代器轉換爲結束迭代器
- 8. 將熊貓系列轉換爲可迭代的迭代
- 9. 內置函數iter()如何將python列表轉換爲迭代器?
- 10. 將QList迭代器轉換爲索引
- 11. 將const auto&轉換爲迭代器
- 12. 將迭代器轉換爲int
- 13. 使用嵌套迭代器是否有意義?
- 14. 迭代的角度表達
- 15. 爲什麼將迭代器轉換爲列表將迭代器移動到最後一個索引
- 16. 是否有可能將列表轉換爲Python中的隊列?
- 17. 將迭代計算轉換爲迭代器 - 這叫做什麼?
- 18. 是否可以將CustomObject []轉換爲String []而無需迭代?
- 19. 隨機訪問迭代器是否被轉換爲InputIterator?
- 20. 存儲STL列表迭代器的指針是否安全?
- 21. 通過角度指令將布爾值轉換爲是/否
- 22. 將遞歸轉換爲迭代代碼
- 23. 是否有可能將兩個迭代轉換爲Python中的「itertools.chain」操作?
- 24. 如何將生成器或迭代器遞歸轉換爲列表
- 25. 爲什麼我不能將逆向迭代器轉換爲向前迭代器?
- 26. 將IQueryable轉換爲列表並迭代使用foreach
- 27. 這段代碼是否有意義將strftime轉換爲一段時間,然後再轉換回字符串?
- 28. 將弧度角度轉換爲CGVector
- 29. 將迭代器中的轉換運算符轉換爲指針是個好主意嗎?
- 30. 適配器將任何迭代器轉換爲隨機訪問迭代器
我很想知道爲什麼問題得到了降低。這是一個關於JVM GC行爲的問題,特別是在Scala中,我找不到任何類似的問題,可以爲我提供關於如何管理這些問題的見解。 –