2017-06-16 9 views
1

List[HugeObjects]に何度も反復処理を加えなければならない場合(例えば、追加、プリペンドなど)、ListIteratorに変換すると意味がありますので、反復するとその要素はが削除され、となります(GCはある時点でそれらを処理するため)リストをメモリの観点からイテレータに変換することは意味がありますか?

+0

私は質問が下落した理由を知りたいです。これはJVM GCの動作、特にScalaに関する質問です。これがどのように管理されているかについての洞察を与えることができる同様の質問は見つかりませんでした。 –

答えて

1

答えは "いいえ、イテレータはリストを参照しているので、イテレータを使用する限りガベージコレクションはありません。"

しかし、実際の実装(https://github.com/scala/scala/blob/v2.12.2/src/library/scala/collection/LinearSeqLike.scala#L41)を見た後、それはそれはない判明:特に「ガベージコレクションから[INGの]オリジナルの配列を防ぐ」、および

List("a").iterator.getClass().getDeclaredFields() 
ない言及したコメントがあります

theseが唯一のフィールドであることを確認しているため、隠れた参照はありません。

しかし! Listで何をしたいのかは言いませんが、イテレータに変換できるのであれば、Listコードはおそらくリストの先頭への参照を失い、ガベージコレクタはそれを集めることができます:When is a Java local variable eligible for GC?この最適化をブロックするScalaによって生成されるコードの違いがありますが、私はそうは思わないでしょう。

+0

私は実際には何も操作を実行しないことを言い、それを反復するだけです。 GCはIteratorに変換されてからリストを収集すると仮定しますが、Iterator全体を消費していなくてもGCは消費されたアイテムを収集しますか? –

+0

「ちょうど反復」(「for」または「foreach」を意味しますか?)も操作です。確かに、それらの項目への唯一の参照がリストからのものであれば、それらは収集されます(GCが開始されると)。 –

+0

私は 'foreach'をやっています。私は操作上、あなたがリスト上で行われた変更を意味すると思った。ありがとう! –

関連する問題