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

时间:2010-10-06 01:04:26

标签: scala sbt

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

10 个答案:

答案 0 :(得分:105)

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

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

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

这将为您提供正确的选项而无需全局修改JAVA_OPTS,它会将自定义JAVA_OPTS放入sbt generated start-script

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

自sbt 0.13.6 .sbtconfig is deprecated。沿着以下行修改/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"
    
  4. 如果您只想为当前的sbt运行设置SBT_OPTS,您可以使用Googol Shan建议的env SBT_OPTS=".." sbt。或者您可以使用Sbt 12中添加的选项:sbt -mem 2048。对于较长的选项列表,这会变得难以处理,但如果您有不同需求的不同项目,这可能会有所帮助。

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

答案 1 :(得分:65)

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

$sbt -mem 2048 

答案 2 :(得分:40)

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

env JAVA_OPTS="-Xmx512m" sbt run

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

答案 3 :(得分:20)

从SBT .sbtconfig开始,不推荐使用

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

答案 4 :(得分:15)

试试这个:

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)
    })
}

答案 5 :(得分:6)

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

JAVA_OPTS='-Xmx512m'

我还没有找到一种方法来执行此操作作为命令参数。

答案 6 :(得分:5)

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

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

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

答案 7 :(得分:4)

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

答案 8 :(得分:3)

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

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

javaOptions += "-Xmx1G"

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

答案 9 :(得分:1)

sbt允许您列出在名为

的文件上运行项目所需的JVM选项

.jvmopts

在项目的根目录中。 然后添加你想要的java选项

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

它已在Windows 10中测试并运行 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

相关问题