我正在尝试使用sbt"运行"运行一个占用大量内存的程序。命令,我似乎遇到了jvm似乎从某个覆盖我的地方获取第二个-Xmx参数的问题。
我正在通过" sbt run"。
运行程序查看流程我可以找到以下内容:
/usr/bin/java -XX:MaxPermSize=256M -Xmx32G -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -jar /usr/local/Cellar/sbt/0.13.6/libexec/sbt-launch.jar run
我的sbt文件如下:
lazy val commonSettings = Seq(
organization := "edu.university",
version := "0.1.0",
scalaVersion := "2.10.2",
name := "Example",
javaOptions += "-Xmx32G"
)
如果您想测试它,这是我创建的一段代码,只是填充内存。
package edu.university
import java.lang.Thread
import scala.collection.mutable.ArrayBuffer
object Main {
val arraySize = 10000
val nmws = 160000000 // no OOM
// val nmws = 180000000 // OOM
val r = scala.util.Random
def main(args: Array[String]): Unit = {
println("hi")
val ab = new ArrayBuffer[Memwaster](nmws)
ab.transform { a => new Memwaster(r.nextInt) }
println("done")
Thread.sleep(20000)
}
}
class Memwaster(foo: Int)
使用较大的nmws值运行将使用略高于1G的内存,然后抛出内存不足错误。
答案 0 :(得分:0)
原来一个解决方案是在sbtopts中设置-mem选项。我在/ usr / local / etc / sbtopts(在OSx Yosemete下)找到了我的sbtopts。对于32G,我将它设置为" -mem 32000"。如果这是一个糟糕的解决方案,请发布另一个答案,我很高兴听到这里的意见。
Sorta通过以下文档解决了这个问题: https://opensource.ncsa.illinois.edu/confluence/display/DFDL/Configure+SBT
这看起来像我的build.sbt中的javaOptions值不会覆盖这个错误吗?或者这是出于某种原因所期望的行为?