我正在尝试使用 sbt“run”命令运行一个占用大量内存的程序,并且我似乎遇到了这样的问题: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 的内存,然后抛出内存不足错误。
最佳答案
事实证明,一种解决方案是在 sbtopts 中设置 -mem 选项。我在/usr/local/etc/sbtopts (在 OSx Yosemite 下)找到了我的 sbtopts。对于 32G,我将其设置为“-mem 32000”。如果这是一个不好的解决方案,请发布另一个答案,我很高兴在这里听到意见。
Sorta 通过以下文档解决了这个问题: https://opensource.ncsa.illinois.edu/confluence/display/DFDL/Configure+SBT
这看起来像是我的 build.sbt 中的 javaOptions 值没有覆盖它的错误吗?或者这是出于某种原因所期望的行为?
关于java - Scala SBT运行时的第二个-Xmx参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252159/