如何通过SBT中的“运行”操作指定用于运行应用程序的JVM最大堆大小“ -Xmx”?


97

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

Answers:


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

53
这已经过时了,现在您可以使用javaOptions += "-Xmx1G"
iwein

1
@iwein我的帖子内容对您来说非常重要。
Arne 2015年

2
请注意,javaOptions只有有分叉的JVM(见效果scala-sbt.org/0.13/docs/Forking.html
亚尔

1
添加fork in run := ture 启用javaOptions
coanor '16

@coanor这个答案是针对sbt的古老版本的。有一个答案比这个答案排名高得多。在提出问题时,此答案是正确的答案。
Arne

113

对于分支的过程,您应该查看Build.scala

要修改分叉进程的Java选项,您需要在Build.scala(或您已命名的版本)中指定它们,如下所示:

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

这会给你正确的选项,而全球范围内修改JAVA_OPTS,并且它将把自定义JAVA_OPTS在 SBT生成的启动脚本

对于非分支进程,通过sbtopts或设置配置最方便sbtconfig取决于您的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使用与/usr/local/etc/sbtopts文件相同的语法在SBT项目的根目录中创建文件。这使项目自成一体。

在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。对于较长的选项列表,这显得很笨拙,但是如果您有不同需求的不同项目,则可能会有所帮助。

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


@iwein-javaOptions没有更改sbt的默认堆空间。我检查了jconsole,它仅显示-Xmx512M。即使在〜/ .sbtconfig中添加了SBT_OPTS,我仍然可以在jconsole中得到它:-Xmx512M -Xms256M -Xmx1G -XX:MaxPermSize = 256M -XX:+ UseConcMarkSweepGC。您在前面看到Xmx512了吗?它有些如何不从Build.scala中选择javaOptions。有指针吗?
阿南德2014年

@Anand也许在0.13中工作有所不同?如果遇到任何问题(可能要花一点时间),我会更新答案,如果您在此期间发现了问题,请告诉我。
iwein

@iwein我在Build.scala中使用了以下内容,它可以正常工作。运行时分叉:= true,运行中的javaOptions == Seq(“-Xms256m”,“-Xmx2048m”,“-XX:+ UseConcMarkSweepGC”)。有关答案stackoverflow.com/questions/27372468/…,请参阅此帖子。谢谢!
阿南德2014年

2
仅供参考,您还可以.sbtopts使用与/usr/local/etc/sbtopts文件相同的语法在SBT项目的根目录中创建文件。这使您的项目自成一体,这在CI情况下非常方便。
Age Mooij

在使用0.13.9(可能为0.13.6)的Windows上,文件为C:\ Program Files(x86)\ sbt \ conf \ sbtconfig.txt。默认情况下,文件中包含“ -Xmx512M”,而此答案中未显示-J。我可以确认sbt程序集发出有关-XX:MaxPermSize的警告,并且当我更改该值时,警告显示的是我输入的值,而不是最初显示的“ 256m”值,从而可以读取此文件。


43

如果在Linux Shell上运行sbt,则可以使用:

env JAVA_OPTS="-Xmx512m" sbt run

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


1
非常感谢你。一个很酷的命令要知道。我从不知道那个“ env”,并且错过了很多这样的工具。
伊万

4
嗯,这对我不起作用!我需要override def fork上面的解决方案。(sbt 0.7.7)
斯科特·莫里森

2
您的sbt文件有可能指定自己的JAVA_OPTS,在这种情况下,这些将被覆盖。然后,您可以直接修改sbt文件,以删除-Xmx标志或将其切换为所需的最大堆大小。
nnythm 2012年

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

1
-J-Xss1M对于大型案例类来说,它有点低,4M似乎更安全。
Marius Soutier

7

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

JAVA_OPTS='-Xmx512m'

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


7

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

使用-JX选项来显示各个选项,例如-J-Xmx2048 -J-XX:MaxPermSize = 512

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


5

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


1
@UwePlonus确实回答了问题。
VasiliNovikov

3

环境变量是_JAVA_OPTIONS,需要设置。设置_JAVA_OPTIONS后,当您设置sbt时,sbt将使用JAVA_OPTIONS及其值显示消息。

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

javaOptions += "-Xmx1G"

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


1
    javaOptions in Test += "-Xmx1G"

这将设置用于测试的JVM选项。也可以与jvm forking(fork in Test := true)一起使用。


1
这在哪里设置build.sbt
javadba

任何地方,如果您有一个1模块项目。在SBT中,定义的顺序通常并不重要。如果您有多个模块,请在其中一些模块上指定,或者,如果需要,可以通过javaOptions in ThisBuild += "-Xmx1G"javaOptions in (ThisBuild, Test) += "-Xmx1G"
-VasiliNovikov

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.