Scala工程,随着项目越做越大(类敏捷开发,目前已经做了三年了),经常会在工程进行构建/build/compile时发生内存错误,如GC overhead limit exceeded、stackoverflowErrorなど类似的错误。
总的来说原因就是:代码越来越多,自身JVM虚拟机内存不够了呗,具体细节大家自己研究。。
error例子(项目保密原因,例子都是网上直接拷贝过来的):
!ENTRY org.scala-ide.sdt.core 4 0 2017-09-08 12:42:02.495 !MESSAGE Error in Scala compiler
!STACK 0
java.lang.StackOverflowError
at scala.tools.nsc.typechecker.Typers$Typer.checkDead(Typers.scala:111)
at scala.tools.nsc.typechecker.Typers$Typer.typedSelectOrSuperCall$1(Typers.scala:4812)
at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5344)
第一种StackoverFlowError经常发生于在sbt compile,或者IDEA上可视化的sbt refresh project的时候,
解决办法:在file—>settings->build->buildTools->sbt->VM parameters选项上输入 -Xss4M(根据自己PC的内存和上面Xmx的大小自行调节,据传说默认是256k,建议1-4M)如果你PC的内存够大,可以把上面的选项也改大一点(开发的电脑是24G的内存,我把JVM可使用内存设为了4098M)
发生类似于下记GC的error,我的工程多发生于IDEA biuld/rebuild时,此时需要调整ScalaCompile的JVM内存设置
Uncaught exception when running trip_dte: java.lang.OutOfMemoryError: GC overhead limit exceeded [error] sbt.ForkMain$ForkError: java.lang.OutOfMemoryError: GC overhead limit exceeded [error] at scala.collection.immutable.HashMap$HashTrieMap.updated0(HashMap.scala:358) [error] at scala.collection.immutable.HashMap.$plus(HashMap.scala:62) [error] at scala.collection.immutable.HashMap.$plus(HashMap.scala:36) [error] at scala.collection.mutable.MapBuilder.$plus$eq(MapBuilder.scala:29) [error] at scala.collection.mutable.MapBuilder.$plus$eq(MapBuilder.scala:25) [error] at scala.collection.generic.Growable.$anonfun$$plus$plus$eq$1(Growable.scala:59) [error] at scala.collection.generic.Growable$$Lambda$44/1950093417.apply(Unknown Source) [error] at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:32) [error] at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:29) [error] at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:38) [error] at scala.collection.generic.Growable.$plus$plus$eq(Growable.scala:59) [error] at scala.collection.generic.Growable.$plus$plus$eq$(Growable.scala:50) [error] at scala.collection.mutable.MapBuilder.$plus$plus$eq(MapBuilder.scala:25) [error] at scala.collection.generic.GenMapFactory.apply(GenMapFactory.scala:48)
解决办法:在file—>settings->build->compiler->Scala compiler->Scala compiler Server
Maximun heap size 和VM options都尝试设置大一些(根据自己的PC情况)
此问题可能在scala 3.X的版本之后会减少发生,本手顺适用于scala2.x的版本
如果你是用git bash进行项目的编译构建的话,需要修改sbt相关目录的 JVM的配置文件,具体可以自己研究(如果修改完没有生效,可能是自身JAVA JVM的设置覆盖了scala JVM的设置,根据这个方向进行研究),修改方法过几天有空格再写,未完待续。。



