2

次のコードを使用して Scala コードをプログラムでコンパイルしています。

val compiler = new Global(settings, reporter)
val run = new compiler.Run
run compile sourceFiles.map(_.fullPath).toList

2.10 RC1 コンパイラは約 3 分間動作し、その後クラッシュしますが、2.10 は無限に何かを実行します (フル CPU 使用)。(プログラムではなく) SBT を介してコンパイラを呼び出すと、正常に動作し、1 分もかからずにコンパイルされます。

短縮された出力は次のようになります (詳細 - 最初の行とエラーの間に 3 分間実行されます)。

[loaded class file C:\Program Files\scala\lib\scala-library.jar(scala/collection/mutable/StringBuilder.class) in 3ms]

Scala 2.10 安定版

それ以上の出力はありません。1 コアの 100% の CPU 使用率。

スカラ 2.10 RC1

RC1 を使用すると、約 3 分後に次のエラーが表示されます。

error: 
     while compiling: Foo.scala
        during phase: typer
     library version: version 2.10.0-RC1
    compiler version: version 2.10.0-RC1
  reconstructed args:

次の出力 (およびアプリケーションがクラッシュする前の最終出力) はOutOfMemoryError. 原因がコード自体にあるのか、コンパイル エラーにあるのかはわかりません。どちらのオプションも、SBT コンソールでコンパイルされ、コンパイラ エラーがそれほど多くのメモリを消費しないはずなので、私には奇妙に思えます。

uncaught exception during compilation: java.lang.OutOfMemoryError
[error] (run-main) java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
    at scala.reflect.internal.Symbols$Symbol.createRefinementClassSymbol(Symbols.scala:1068)
    at scala.reflect.internal.Symbols$Symbol.newRefinementClass(Symbols.scala:406)
    at scala.reflect.internal.Types$class.refinedType(Types.scala:3504)
    at scala.reflect.internal.SymbolTable.refinedType(SymbolTable.scala:12)
    at scala.reflect.internal.Types$Type.narrow(Types.scala:459)
    at scala.reflect.internal.Types$class.specializedBy$1(Types.scala:6125)
    at scala.reflect.internal.Types$class.specializesSym(Types.scala:6129)
    at scala.reflect.internal.SymbolTable.specializesSym(SymbolTable.scala:12)
    at scala.reflect.internal.Types$$anonfun$thirdTry$1$2.apply(Types.scala:6021)
    at scala.reflect.internal.Types$$anonfun$thirdTry$1$2.apply(Types.scala:6021)
    at scala.collection.Iterator$class.forall(Iterator.scala:739)
    at scala.collection.AbstractIterator.forall(Iterator.scala:1156)
    at scala.collection.IterableLike$class.forall(IterableLike.scala:75)
    at scala.reflect.internal.Scopes$Scope.forall(Scopes.scala:44)
    at scala.reflect.internal.Types$class.thirdTry$1(Types.scala:6021)
    at scala.reflect.internal.Types$class.secondTry$1(Types.scala:5982)
    at scala.reflect.internal.Types$class.firstTry$1(Types.scala:5958)
    at scala.reflect.internal.Types$class.isSubType2(Types.scala:6101)
    at scala.reflect.internal.Types$class.isSubType(Types.scala:5710)
    at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:12)
    at scala.reflect.internal.Types$class.thirdTry$1(Types.scala:6043)
    at scala.reflect.internal.Types$class.secondTry$1(Types.scala:5982)
    at scala.reflect.internal.Types$class.firstTry$1(Types.scala:5958)
    at scala.reflect.internal.Types$class.isSubType2(Types.scala:6101)
    at scala.reflect.internal.Types$class.isSubType(Types.scala:5710)
    at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:12)
    at scala.reflect.internal.Types$class.scala$reflect$internal$Types$$specializesSym(Types.scala:6142)
    at scala.reflect.internal.Types$class.specializedBy$1(Types.scala:6125)
    at scala.reflect.internal.Types$class.specializesSym(Types.scala:6129)
    at scala.reflect.internal.SymbolTable.specializesSym(SymbolTable.scala:12)
    at scala.reflect.internal.Types$$anonfun$thirdTry$1$2.apply(Types.scala:6021)
    at scala.reflect.internal.Types$$anonfun$thirdTry$1$2.apply(Types.scala:6021)
[trace] Stack trace suppressed: run 'last compile:run' for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
    at scala.sys.package$.error(package.scala:27)

Scala でOutOfMemoryErrorコンパイル エラーが発生するのはなぜですか? . ただし、実際にコンパイル用のヒープ領域が不足しているだけなのかどうかはわかりません。関係する Maven はありません。Scala コードと、ローカル ビルド パス上のいくつかの JAR だけです。

OutOfMemoryエラーの原因またはエラーを修正するための微調整を探しています。

4

1 に答える 1

0

(JDKで)使用すると、コンパイラが実際にメモリ不足jvisualvm.exeであることがわかりました。GC はメモリを解放するために一生懸命働いていたので、無限ループのように見えました (正確には、シンボル テーブルが拡大されたときに発生しました)。HashSet

ヒープ サイズを 2GB に増やすと、ここで問題が修正されました。

于 2013-01-11T19:59:28.840 に答える