Scala Compiler не завершается (вызывается программно)

Я программно компилирую код Scala с помощью этого куска кода:

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

Компилятор 2.10 RC1 работает примерно три минуты, а затем падает, тогда как 2.10 бесконечно что-то делает (полная загрузка ЦП). Когда я вызываю компилятор через SBT (а не программно), он работает нормально и компилируется менее чем за минуту.

Сокращенный вывод выглядит следующим образом (многословно - и работает три минуты между первой строкой и ошибкой):

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

Скала 2.10 стабильная

Больше никаких выходных. 100% загрузка процессора на 1 ядро.

Scala 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)

Я наткнулся на Почему я получаю ошибку компиляции OutOfMemoryError в Scala?, Однако я не уверен, что мне просто не хватает места в куче для компиляции. Maven не задействован, это всего лишь Scala-код и несколько JAR-файлов на локальном пути сборки.

Я ищу причину OutOfMemory ошибка или настройка, чтобы исправить ошибку.

1 ответ

Решение

С помощью jvisualvm.exe (в JDK) мы обнаружили, что компилятору действительно не хватает памяти. GC работал слишком усердно, освобождая память, поэтому это выглядело как бесконечный цикл (если быть точным: случалось, когда таблица символов HashSet был расширен).

Увеличение размера кучи до 2 ГБ решило проблему здесь.

Другие вопросы по тегам