3

特定の操作を実行すると、それ自体の変更されたバージョンを返す大きな不変オブジェクトを持つプログラムがあります。var myObj = getInitialObject();のようなことをして、sbtコンソールでテストしようとしています。次に、myObj = myObj.getNewOne();を繰り返し呼び出します。

古いオブジェクトへの参照は残っていませんが、メモリが解放されていないようです。最終的に、OutOfMemoryError:GCオーバーヘッド制限を超えました。私はscalareplプロンプトで簡単な例を使って問題を再現することができました:

scala> val foo = List.fill(1000000){new Object()}
foo:List [java.lang.Object] = List(java.lang.Object @ 14fd510、java.lang.Object @ 202d0e1c、java.lang.Object @ 6df960c4、java.lang.Object @ f401c44、java.lang.Object @ 39ffbc2e、java.lang.Object @ 449b8dc1、java.lang.Object @ 40779d17、java.lang.Object @ 6cea7211、java.lang.Object @ 13e6f1f4、java.lang.Object @ 1f16d461、java.lang.Object @ 13d13c39 、java.lang.Object @ dc8cc59、java.lang.Object @ 79dfee20、java.lang.Object @ 5c8ab562、java.lang.Object @ 168a6465、java.lang.Object @ 57c52e72、java.lang.Object @ 526c6b62、java .lang.Object @ 4bfe1934、java.lang.Object @ 1728cbe6、java.lang.Object @ 776274ea、java.lang.Object @ 60e9ebe1、java.lang.Object @ 1d7d327c、java.lang.Object @ 67d7a04、java.lang .Object @ 17d59ff0、java.lang.Object @ 49f751c9、java.lang.Object @ c1a890f、java.lang.Object @ 221c3dfe、java.lang.Object @ 6c2a0030、java.lang.O ..
scala> val foo = List.fill(1000000){new Object()}
foo:List [java.lang.Object] = List(java.lang.Object @ 6e8fb561、java.lang.Object @ 1ccd2bfc、java.lang.Object @ 6202bc29、....(残りの出力は省略)
scala> val foo = List.fill(1000000){new Object()}
....さらに数回繰り返して、次を取得します。

scala> val foo = List.fill(1000000){new Object()}
ヌル

java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました
    scala.tools.nsc.transform.SpecializeTypes $$ anonfun $ 13.apply(SpecializeTypes.scala:669)で
    scala.tools.nsc.transform.SpecializeTypes $$ anonfun $ 13.apply(SpecializeTypes.scala:667)で
    scala.collection.TraversableLike $$ anonfun $ flatMap $ 1.apply(TraversableLike.scala:200)で
    scala.collection.TraversableLike $$ anonfun $ flatMap $ 1.apply(TraversableLike.scala:200)で
    scala.collection.LinearSeqOptimized $ class.foreach(LinearSeqOptimized.scala:59)で
    scala.collection.immutable.List.foreach(List.scala:45)で
    scala.collection.TraversableLike $ class.flatMap(TraversableLike.scala:200)で
    scala.collection.immutable.List.flatMap(List.scala:45)で
    scala.tools.nsc.transform.SpecializeTypes.specializeClass(SpecializeTypes.scala:667)で
    scala.tools.nsc.transform.SpecializeTypes.transformInfo(SpecializeTypes.scala:1065)で
    scala.tools.nsc.transform.InfoTransform $ Phase $$ anon $ 1.transform(InfoTransform.scala:38)で
....。
...。

valの代わりに毎回再宣言せずに「var」を使用することは役に立たないようです。repl / sbtを解放/ガベージコレクションして、関連性のなくなったオブジェクト参照のメモリを収集するにはどうすればよいですか?

4

1 に答える 1

3

まだ、できません。 https://issues.scala-lang.org/browse/SI-4331

于 2012-09-05T08:35:34.360 に答える