Scala 从内存的角度将列表转换为迭代器有意义吗?

Scala 从内存的角度将列表转换为迭代器有意义吗?,scala,memory,garbage-collection,jvm,Scala,Memory,Garbage Collection,Jvm,如果我有一个列表[HugeObjects],其中有许多元素,我只需要迭代一次,并且没有对其进行任何操作(例如追加、预结束等),那么我将列表转换为迭代器,这样当我迭代它时,元素将被删除,更多的内存将可用,这有意义吗(因为GC会在某个时候处理它们)?我希望答案是“否,迭代器保留对列表的引用,因此只要使用迭代器,就不会对任何内容进行垃圾收集。” 但在查看了实际的实现()之后,发现它并没有:有一条注释特别提到“阻止[ing]原始seq进行垃圾收集”,并且 确认这些是唯一的字段,因此没有隐藏的引用 但是!

如果我有一个
列表[HugeObjects]
,其中有许多元素,我只需要迭代一次,并且没有对其进行任何操作(例如追加、预结束等),那么我将
列表
转换为
迭代器
,这样当我迭代它时,元素将被删除,更多的内存将可用,这有意义吗(因为GC会在某个时候处理它们)?

我希望答案是“否,迭代器保留对列表的引用,因此只要使用迭代器,就不会对任何内容进行垃圾收集。”

但在查看了实际的实现()之后,发现它并没有:有一条注释特别提到“阻止[ing]原始seq进行垃圾收集”,并且

确认
这些
是唯一的字段,因此没有隐藏的引用


但是!您没有说您想在
列表
上执行什么操作,但是如果您可以转换为迭代器,那么
列表
代码也可能会丢失对列表开头的引用,垃圾收集器可以收集它:。Scala生成的代码可能存在一些差异,这会阻止此优化我很想知道为什么这个问题被否决。这是一个关于JVM GC行为的问题,特别是对于Scala,我找不到任何类似的问题可以为我提供有关如何管理它的见解。我实际上提到我不执行任何操作,只需迭代它。我假设GC会d收集列表,因为它已转换为迭代器,但GC是否会收集已使用的项,即使我没有使用整个迭代器?“只是迭代”(您的意思是
for
foreach
?)也是一个操作。当然,如果对这些项的唯一引用来自列表,那么它们将被收集(一旦GC启动).我会为每个人做
foreach
。我以为你所说的操作是指对列表进行修改。谢谢!
List("a").iterator.getClass().getDeclaredFields()