我用这段代码以编程方式编译Scala代码:
val compiler = new Global(settings, reporter)
val run = new compiler.Run
run compile sourceFiles.map(_.fullPath).toList
2.10 RC1编译器工作三分钟然后崩溃,而2.10无限做某事(完全CPU使用)。当我通过SBT(而不是以编程方式)调用编译器时,它工作正常,并在不到一分钟的时间内编译。
缩短的输出看起来像这样(详细 - 在第一行和错误之间运行三分钟):
[loaded class file C:\Program Files\scala\lib\scala-library.jar(scala/collection/mutable/StringBuilder.class) in 3ms]
Scala 2.10稳定
没有进一步的输出。 1 Core的100%CPU使用率。
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)
我偶然发现了Why am I getting OutOfMemoryError compilation error in Scala?。但是,我不确定我是否真的只是缺少编译的堆空间。没有涉及Maven,它只是Scala代码和本地构建路径上的一些JAR。
我正在查找OutOfMemory
错误的原因或修正错误。
答案 0 :(得分:0)
使用jvisualvm.exe
(在JDK中)我们发现编译器确实在内存上运行不足。 GC正在努力释放内存,因此它看起来像一个无限循环(确切地说:当符号表' s HashSet
被放大时发生)。
将堆大小增加到2GB 修复了此问题。