如何指定JVM最大堆大小“ -XMX”,用于在SBT中运行使用“运行”操作的应用程序?

StackOverflow https://stackoverflow.com/questions/3868863

  •  28-09-2019
  •  | 
  •  

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

有帮助吗?

解决方案

尝试这个:

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_opts, 它会将自定义的java_opts放在 SBT生成的start-script

为了 非分叉 进程最方便地设置配置通过 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 使用与在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有实际泄漏,最终会迫使重新启动。

在SBT版本12中,有一个选择:

$sbt -mem 2048 

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

env JAVA_OPTS="-Xmx512m" sbt run

这是我通常用于运行SBT项目的命令。

.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_opts设置环境变量。

使用-jx选项可用于单个选项的SBT,例如-J -XMX2048 -J -XX:MaxPermsize = 512

SBT的较新版本具有“ -MEM”选项。

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

JAVA_OPTS='-Xmx512m'

我还没有找到作为命令参数这样做的方法。

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

环境变量是_java_options,需要设置。设置_JAVA_OPTIONS,SBT将使用Java_options和值显示消息。

另外,您可以在sbt或.scala文件中设置javaoption

javaOptions += "-Xmx1G"

在SBT Shell中,您可以运行显示Javaoptions以查看设置的值。

    javaOptions in Test += "-Xmx1G"

这设置了测试的JVM选项。也与JVM分叉一起工作(fork in Test := true).

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top