102

我的应用程序执行大型数据数组处理,并且需要比 JVM 默认提供的更多内存。我知道在 Java 中它是由“-Xmx”选项指定的。如何设置 SBT 以使用特定的“-Xmx”值来运行具有“运行”操作的应用程序?

4

11 回答 11

121

对于分叉进程,您应该查看 Build.scala

要修改分叉进程的 java 选项,您需要在 Build.scala(或任何您为构建命名的名称)中指定它们,如下所示:

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)

这将为您提供正确的选项,而无需全局修改 JAVA_OPTS,并将自定义 JAVA_OPTS 放入sbt 生成的启动脚本中

对于非分叉进程,最方便的是通过sbtoptssbtconfig取决于您的 sbt 版本来设置配置。

由于 sbt 0.13.6.sbtconfig已弃用/usr/local/etc/sbtopts沿着这些方向修改:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

您还可以.sbtopts使用与文件中相同的语法在 SBT 项目的根目录中创建一个/usr/local/etc/sbtopts文件。这使得项目自成一体。

在 sbt 0.13.6 之前,您可以在 .sbtconfig 中为非分叉进程设置选项:

  1. 检查 sbt 在哪里:

    $ which sbt
    /usr/local/bin/sbt
    
  2. 看内容:

    $ cat /usr/local/bin/sbt
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
    
  3. 设置正确的 jvm 选项以防止 OOM(常规和 PermGen):

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
    

如果您只想为当前运行的 sbt 设置 SBT_OPTS,您可以env SBT_OPTS=".." sbt按照 Googol Shan 的建议使用。或者您可以使用 Sbt 12 中添加的选项:sbt -mem 2048. 对于更长的选项列表,这会变得笨拙,但如果您有不同的项目有不同的需求,它可能会有所帮助。

请注意,CMSClassUnloadingEnabled 与 UseConcMarkSweepGC 一起有助于保持 PermGen 空间的清洁,但根据您使用的框架,您可能会在 PermGen 上发生实际泄漏,这最终会强制重启。

于 2013-01-28T11:47:02.010 回答
70

在 sbt 版本 12 及以后的版本中,有一个选项:

$sbt -mem 2048 
于 2013-05-31T15:24:32.530 回答
45

如果你在 linux shell 上运行 sbt,你可以使用:

env JAVA_OPTS="-Xmx512m" sbt run

这是我运行我的 sbt 项目时常用的命令。

于 2010-10-06T08:13:50.430 回答
23

.sbtconfig从 SBT 开始不推荐使用0.13.6。相反,我/usr/local/etc/sbtopts通过以下方式配置了这些选项:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
于 2014-10-27T11:34:20.307 回答
17

试试这个:

class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
    override def fork = Some(new ForkScalaRun {
        override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
        override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
    })
}
于 2010-10-29T16:59:06.927 回答
7

我知道有一种方法。设置环境变量 JAVA_OPTS。

JAVA_OPTS='-Xmx512m'

我还没有找到将其作为命令参数的方法。

于 2010-10-06T02:20:52.773 回答
7

使用 JAVA_OPTS 设置环境变量。

使用 -JX 选项来 sbt 单个选项,例如 -J-Xmx2048 -J-XX:MaxPermSize=512

较新版本的 sbt 有一个“-mem”选项。

于 2014-05-22T12:18:48.650 回答
5

javaOptions += "-XX:MaxPermSize=1024"我们看到通过 sbt 运行 Specs2 测试时抛出 java.lang.OutOfMemoryError 时,上面 @iwein 引用的 build.sbt 中的 对我们有用。

于 2014-02-12T15:55:36.070 回答
3

环境变量是_JAVA_OPTIONS,需要设置。一旦你设置了 _JAVA_OPTIONS,当你 sbt 时,sbt 将使用 JAVA_OPTIONS 和值显示消息。

或者,您可以在 sbt 或 .scala 文件中设置 javaOption,例如

javaOptions += "-Xmx1G"

从 sbt shell 你可以运行 show javaOptions 来查看设置的值。

于 2015-08-15T13:28:23.570 回答
1
    javaOptions in Test += "-Xmx1G"

这会设置测试的 JVM 选项。也适用于 jvm 分叉 ( fork in Test := true)。

于 2015-09-10T10:32:10.207 回答
1

sbt 允许您列出在名为的文件上运行项目所需的 JVM 选项

.jvmopts

in the root of your project. then add the java options that you want

cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M

it is tested and works in windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

于 2018-05-28T01:09:05.830 回答