如何指定JVM最大堆大小“ -XMX”,用于在SBT中运行使用“运行”操作的应用程序?
题
我的应用程序进行大型数据阵列处理,并且需要比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中设置选项 非分叉 流程:
检查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(常规和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