【问题标题】:Scala SBT second -Xmx parameter when runningScala SBT运行时的第二个-Xmx参数
【发布时间】:2015-09-23 23:20:19
【问题描述】:

我正在尝试使用 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 的内存,然后引发内存不足错误。

【问题讨论】:

  • 那么,你的问题是什么?
  • 如何删除第二个 -Xmx 参数。考虑到 1G 左右的内存不足,它似乎使用了第二个。 “... -Xmx32G -Xms1024m -Xmx1024m ...” 我应该提到我正在通过“sbt run”运行它。
  • 我建议您尝试stackoverflow.com/questions/3868863/… 中列出的说明 - 如果您使用的是 SBT 0.13.6 或更高版本,请查看 iwein 的答案(不是公认的答案)
  • 可能在$HOME/.sbtrc<project>/.sbtrc中定义?
  • 这些文件似乎都不存在。我还检查了环境变量,似乎没有一个是相关的。

标签: java scala jvm sbt


【解决方案1】:

事实证明,一种解决方案是在 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 值没有覆盖它的错误吗?或者这是出于某种原因所期望的行为?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多