我的应用程序执行大型数据数组处理,并且需要比 JVM 默认提供的更多内存。我知道在 Java 中它是由“-Xmx”选项指定的。如何设置 SBT 以使用特定的“-Xmx”值来运行具有“运行”操作的应用程序?
11 回答
对于分叉进程,您应该查看 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
使用与文件中相同的语法在 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
试试这个:
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)
})
}
我知道有一种方法。设置环境变量 JAVA_OPTS。
JAVA_OPTS='-Xmx512m'
我还没有找到将其作为命令参数的方法。
使用 JAVA_OPTS 设置环境变量。
使用 -JX 选项来 sbt 单个选项,例如 -J-Xmx2048 -J-XX:MaxPermSize=512
较新版本的 sbt 有一个“-mem”选项。
当javaOptions += "-XX:MaxPermSize=1024"
我们看到通过 sbt 运行 Specs2 测试时抛出 java.lang.OutOfMemoryError 时,上面 @iwein 引用的 build.sbt 中的 对我们有用。
环境变量是_JAVA_OPTIONS,需要设置。一旦你设置了 _JAVA_OPTIONS,当你 sbt 时,sbt 将使用 JAVA_OPTIONS 和值显示消息。
或者,您可以在 sbt 或 .scala 文件中设置 javaOption,例如
javaOptions += "-Xmx1G"
从 sbt shell 你可以运行 show javaOptions 来查看设置的值。
javaOptions in Test += "-Xmx1G"
这会设置测试的 JVM 选项。也适用于 jvm 分叉 ( fork in Test := true
)。
sbt 允许您列出在名为的文件上运行项目所需的 JVM 选项
.jvmopts
in the root of your project. then add the java options that you want
cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M
it is tested and works in windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html