Scala 如何指定JVM最大堆大小“-Xmx";用于运行带“的应用程序”;“运行”;SBT中的行动?

Scala 如何指定JVM最大堆大小“-Xmx";用于运行带“的应用程序”;“运行”;SBT中的行动?,scala,sbt,Scala,Sbt,我的应用程序处理大型数据数组,需要比JVM默认提供的内存更多的内存。我知道在Java中它是由“-Xmx”选项指定的。如何设置SBT以使用特定的“-Xmx”值来运行具有“run”操作的应用程序?我知道一种方法。设置环境变量JAVA_OPTS JAVA_OPTS='-Xmx512m' 我还没有找到一种方法作为命令参数来执行此操作。如果您在linux shell上运行sbt,您可以使用: env JAVA_OPTS="-Xmx512m" sbt run 这是我通常用来运行sbt项目的命令。请尝试以

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

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

JAVA_OPTS='-Xmx512m'

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

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

env JAVA_OPTS="-Xmx512m" sbt run
这是我通常用来运行sbt项目的命令。

请尝试以下操作:

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

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

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

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)
这将在不全局修改JAVA_选项的情况下为您提供适当的选项,并将自定义JAVA_选项置于

对于非分叉进程,根据您的sbt版本,通过
sbtopts
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
您还可以使用与
/usr/local/etc/sbtopts
文件相同的语法,在SBT项目的根目录中创建一个
.sbtopts
文件。这使得项目是独立的

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

  • 检查sbt的位置:

    $ which sbt
    /usr/local/bin/sbt
    
  • 请看内容:

    $ 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 "$@"
    
  • 设置正确的jvm选项以防止OOM(常规和永久):

  • 如果您只想为当前运行的SBT设置SBT选项,您可以使用Googol Shan建议的
    env SBT_OPTS=“..”SBT
    。或者您可以使用Sbt 12中添加的选项:
    Sbt-mem 2048
    。对于较长的选项列表来说,这会变得很麻烦,但如果您有不同需求的不同项目,这可能会有所帮助


    请注意,CMSClassUnloadingEnabled与UseConcMarkSweepGC配合使用有助于保持PermGen空间干净,但根据您使用的框架,PermGen上可能存在实际泄漏,这最终会强制重新启动

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

    $sbt -mem 2048 
    

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

    使用java\u OPTS设置环境变量

    将-J-X选项用于单个选项的sbt,例如-J-Xmx2048-J-XX:MaxPermSize=512


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

    .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
    

    环境变量是_JAVA_OPTIONS,需要设置它。 一旦您设置了_JAVA_选项,当您进行sbt时,sbt将使用JAVA_选项和值显示消息

    或者,您可以在sbt或.scala文件中设置javaOption e、 g

    在sbt shell中,您可以运行show javaOptions来查看设置的值

        javaOptions in Test += "-Xmx1G"
    

    这将为测试设置JVM选项。也可用于jvm分叉(
    fork-in-Test:=true
    )。

    sbt允许您列出在名为

    .jvmopts

    在项目的根目录中。 然后添加所需的java选项

    cat .jvmopts
    -Xms512M
    -Xmx4096M
    -Xss2M
    -XX:MaxMetaspaceSize=1024M
    
    它经过测试并在Windows10中运行

    非常感谢。这是一个很酷的命令。我从来都不知道那个“env”,而且很多次都错过了这样一个工具。嗯,这对我来说不管用!我需要上面的
    覆盖def fork
    解决方案。(sbt 0.7.7)您的sbt文件可能指定了自己的JAVA_选项,在这种情况下,这些选项将被覆盖。然后,您可以直接修改sbt文件,删除-Xmx标志或将其切换到所需的最大堆大小。我认为不需要
    env
    ,这已经过时了,现在您可以使用
    javaOptions+=“-Xmx1G”
    @i我的帖子内容对您来说似乎非常重要。请注意,
    javaOptions
    仅对分叉JVM有效(请参阅)添加
    fork-in-run:=true
    启用
    javaOptions
    @coanor此答案适用于sbt的一个古老版本。有一个答案的排名比这个高很多。这个答案在提问时是正确的。@iwein-javaOptions没有更改sbt的默认heapspace。我签入了jconsole,它只显示了-Xmx512M。即使我在~/.sbtconfig中添加了SBT_OPTS,我仍然在jconsole中得到它:-Xmx512M-Xms256M-Xmx1G-XX:MaxPermSize=256M-XX:+useConMarkSweepGC。你看到前面的Xmx512了吗?它没有从Build.scala中选择javaOptions。有什么建议吗?@Anand可能在0.13中的工作方式略有不同?如果我遇到任何问题(可能需要一段时间),我会更新答案,如果你能及时找到答案,请告诉我。@I我在Build.scala中使用了下面的方法,效果很好。run中的fork:=true,run++=Seq中的javaOptions(“-Xms256m”、“-Xmx2048m”、“-XX:+useConMarkSweepGC”)。有关答案,请参阅本文。谢谢仅供参考,您还可以使用与
    /usr/local/etc/sbtopts
    文件相同的语法,在SBT项目的根目录中创建
    .sbtopts
    文件。这使您的项目具有自包含性,在CI情况下非常方便。在使用0.13.9(可能是0.13.6)的Windows上,文件为C:\Program Files(x86)\sbt\conf\sbtconfig.txt。默认情况下,该文件中有“-Xmx512M”,但没有此答案中显示的-J。我可以通过sbt assembly发出关于-XX:MaxPermSize的警告来确认正在读取此文件,并且当我更改该值时,该警告显示我输入的值,而不是“256m”值
        javaOptions in Test += "-Xmx1G"
    
    cat .jvmopts
    -Xms512M
    -Xmx4096M
    -Xss2M
    -XX:MaxMetaspaceSize=1024M