编译Ammonite脚本时耗尽堆内存

时间:2017-09-18 16:32:08

标签: java scala jvm sbt ammonite

我正在尝试创建一个脚本,使用Slick Code Generator将整个数据库映射到Scala文件,运行docker容器,并在其内部运行的数据库上执行ddl,从而有效地重建数据库每次运行。

这实际上很有效(我只需编辑文件的第一行,删除包声明),但只有当我将Tables.scala(输出文件)修剪为一个映射时,它才会生成新数据库实例中的关联表(使用“Tables.ddl.createStatements”)。

问题是完整文件是生成代码的8k +行,每次尝试编译(运行“amm buildDatabase.sc”)时,抛出此异常:

java.lang.OutOfMemoryError: Java heap space
  java.lang.reflect.Array.newArray(Native Method)
  java.lang.reflect.Array.newInstance(Array.java:75)
  scala.collection.mutable.ArrayOps.slice(ArrayOps.scala:48)
  scala.collection.mutable.ArrayOps.slice$(ArrayOps.scala:44)
  scala.collection.mutable.ArrayOps$ofChar.slice(ArrayOps.scala:227)
  scala.collection.IndexedSeqOptimized.drop(IndexedSeqOptimized.scala:140)
  scala.collection.IndexedSeqOptimized.drop$(IndexedSeqOptimized.scala:140)
  scala.collection.mutable.ArrayOps$ofChar.drop(ArrayOps.scala:227)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:233)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.api.Trees$Transformer.$anonfun$transformTrees$1(Trees.scala:2559)
  scala.reflect.api.Trees$Transformer.transformTrees(Trees.scala:2559)
  scala.reflect.internal.Trees.itransform(Trees.scala:1358)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.internal.Trees.itransform(Trees.scala:1356)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.internal.Trees.itransform(Trees.scala:1358)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)

我试过提供以下内容

以jar身份运行:

java -Xms2g -Xmx2g -jar amm buildDatabase.sc

改变JAVA_OPTS:

export SBT_OPTS="-Xmx2g -Xms2g"  

改变SBT_OPTS:

export SBT_OPTS="-Xmx2g -Xms2g"              

......但似乎没有任何效果。这使用Intellij编译(并运行!),堆内存为512m。

请注意,因为每次运行脚本时都需要重新生成此文件,所以我将主文件分成三个编译块。我不确定这是否与我的问题有关。

//Add 3rd party repo
import coursier.MavenRepository
interp.repositories() ++= Seq(MavenRepository("https://maven.alfresco.com/nexus/content/groups/public"))

@ //recompile

import $file.RefreshTables, RefreshTables.refreshTableDefinitions
refreshTableDefinitions()

@ //recompile

import $file.Constants, Constants._
import $file.Utils, Utils.startContainerAndCreateDatabase
import $file.CreateTables, CreateTables.createTables

startContainerAndCreateDatabase(DATABASE_NAME)
createTables()

println("done?")

请帮忙!谢谢。 :)

0 个答案:

没有答案