如果我有一个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. 将迭代器代码转换为流
- 3. c#悖论:将列表转换为数组迭代更有效?
- 4. 将dc.js转换为React是否有意义?
- 5. 将rend迭代器转换为结束迭代器
- 6. 内置函数iter()如何将python列表转换为迭代器?
- 7. 将熊猫系列转换为可迭代的迭代
- 8. 将迭代器转换为int
- 9. 如何将值转换为迭代器
- 10. 将const auto&转换为迭代器
- 11. 为什么将迭代器转换为列表将迭代器移动到最后一个索引
- 12. 将迭代计算转换为迭代器 - 这叫做什么?
- 13. 通过角度指令将布尔值转换为是/否
- 14. 如何将生成器或迭代器递归转换为列表
- 15. 为什么我不能将逆向迭代器转换为向前迭代器?
- 16. 是否有可能将两个迭代转换为Python中的“itertools.chain”操作?
- 17. 将IQueryable转换为列表并迭代使用foreach
- 18. 将迭代器中的转换运算符转换为指针是个好主意吗?
- 19. 适配器将任何迭代器转换为随机访问迭代器
- 20. 如何将Peekable迭代器转换回原始迭代器?
- 21. 是否有一个“转换器”,将CSS转换为IE兼容?
- 22. 是否可以将此映射/过滤器代码转换为列表理解?
- 23. 如何将数据从json转换为使用角度js的对象列表
- 24. 是否有内置函数将NodeList转换为真实列表(ghcjs-dom)?
- 25. 迭代器是否有意识的位置?
- 26. 是否有表格转换器的div?
- 27. 存储三角函数调用的结果是否有意义?
- 28. 替换为序列化的迭代器
- 29. 如何将igraph ego()列表转换为有意义的数据框?
- 30. 将迭代转换为递归
我很想知道为什么问题得到了降低。这是一个关于JVM GC行为的问题,特别是在Scala中,我找不到任何类似的问题,可以为我提供关于如何管理这些问题的见解。 –