2013-01-10 24 views
2

我編程編譯Scala代碼與這段代碼: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] 

斯卡拉2.10穩定

沒有進一步的輸出。 1核心的CPU使用率爲100%。

斯卡拉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

java選項應該是'-Xmx1024M',而不是'-Xmx:1024M'。先檢查一下。 –

+0

@RégisJean-Gilles Thx。它的配置正確,我在帖子中拼錯了。編輯。 –

+0

您是否嘗試更新至穩定版本?也許它已經被修復了。 – soc

回答

0

使用jvisualvm.exe(在JDK中)我們發現編譯器確實在內存上運行得很低。 GC正在努力解放內存,所以它看起來像一個無限循環(準確地說:當符號表的HashSet被放大時發生)。

增加堆大小爲2GB這裏固定的問題。

+0

你是如何得到它的工作?你如何從編譯器中獲得類加載的類? –