如何在SBT中运行具有"运行"操作的应用程序来指定JVM最大堆大小"-Xmx"?

Iva*_*van 93 scala sbt

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

iwe*_*ein 109

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

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

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)
Run Code Online (Sandbox Code Playgroud)

这会给你正确的选项,而全球范围内修改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
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 检查sbt的位置:

    $ which sbt
    /usr/local/bin/sbt
    
    Run Code Online (Sandbox Code Playgroud)
  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 "$@"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 设置正确的jvm选项以防止OOM(常规和PermGen):

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
    
    Run Code Online (Sandbox Code Playgroud)

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

请注意,与UseConcMarkSweepGC一致的CMSClassUnloadingEnabled有助于保持PermGen空间的清洁,但是根据您使用的框架,您可能会在PermGen上出现实际泄漏,这最终会导致重新启动.

  • 仅供参考,您还可以使用与`/ usr/local/etc/sbtopts`文件中相同的语法在SBT项目的根目录中创建`.sbtopts`文件.这使您的项目自包含,这在CI情况下非常方便. (2认同)

scr*_*des 65

在sbt版本12之后,有一个选项:

$sbt -mem 2048 
Run Code Online (Sandbox Code Playgroud)

  • 在win 8.1中,这个命令对我不起作用:`不是一个有效的命令:mem(类似:set)` (5认同)

Goo*_*han 42

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

env JAVA_OPTS="-Xmx512m" sbt run
Run Code Online (Sandbox Code Playgroud)

这是我常用的命令来运行我的sbt项目.

  • 嗯,这对我不起作用!我需要上面的`覆盖def fork'解决方案.(sbt 0.7.7) (4认同)
  • 您的sbt文件可能指定了自己的JAVA_OPTS,在这种情况下,这些将被覆盖.然后,您可以直接修改sbt文件,删除-Xmx标志或将其切换到所需的最大堆大小. (2认同)

omn*_*nom 22

.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
Run Code Online (Sandbox Code Playgroud)


Arn*_*rne 16

试试这个:

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)
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 这已经过时了,现在你可以使用`javaOptions + =" - Xmx1G"` (53认同)
  • 是的,它是Arne,我希望你不介意. (5认同)
  • 请注意,`javaOptions` 仅对分叉的 JVM 有效(参见 http://www.scala-sbt.org/0.13/docs/Forking.html) (2认同)

Bre*_*ett 7

使用JAVA_OPTS进行环境变量设置.

使用-JX选项为各个选项设置sbt,例如-J-Xmx2048 -J-XX:MaxPermSize = 512

较新版本的sbt具有"-mem"选项.


Syn*_*sso 6

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

JAVA_OPTS='-Xmx512m'
Run Code Online (Sandbox Code Playgroud)

我还没有找到一种方法来执行此命令参数.


小智 5

javaOptions += "-XX:MaxPermSize=1024"用如上述对我们工作时,我们看到,同时通过SBT运行Specs2测试抛出java.lang.OutOfMemoryError @iwein引用我们build.sbt。