我的应用程序执行大型数据阵列处理,并且需要比JVM默认提供的内存更多的内存。我在Java中知道它是由“-Xmx”选项指定的。如何设置SBT以使用特定的“-Xmx”值来运行具有“运行”操作的应用程序?
答案 0 :(得分:105)
对于分叉进程,您应该查看Build.scala
要修改分叉进程的java选项,您需要在Build.scala(或任何您命名的构建)中指定它们,如下所示:
val buildSettings = Defaults.defaultSettings ++ Seq(
//…
javaOptions += "-Xmx1G",
//…
)
这将为您提供正确的选项而无需全局修改JAVA_OPTS,和它会将自定义JAVA_OPTS放入sbt generated start-script
对于非分叉进程,最方便的是通过sbtopts
或sbtconfig
设置配置,具体取决于您的sbt版本。
自sbt 0.13.6 .sbtconfig
is deprecated。沿着以下行修改/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,您可以使用Googol Shan建议的env SBT_OPTS=".." sbt
。或者您可以使用Sbt 12中添加的选项:sbt -mem 2048
。对于较长的选项列表,这会变得难以处理,但如果您有不同需求的不同项目,这可能会有所帮助。
请注意,与UseConcMarkSweepGC一致的CMSClassUnloadingEnabled有助于保持PermGen空间的清洁,但是根据您使用的框架,您可能会在PermGen上发生实际泄漏,最终会导致重新启动。
答案 1 :(得分:65)
在sbt版本12之后,有一个选项:
$sbt -mem 2048
答案 2 :(得分:40)
如果你在linux shell上运行sbt,你可以使用:
env JAVA_OPTS="-Xmx512m" sbt run
这是我常用的命令来运行我的sbt项目。
答案 3 :(得分:20)
.sbtconfig
开始,不推荐使用 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
答案 4 :(得分:15)
试试这个:
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)
})
}
答案 5 :(得分:6)
我知道有一种方法。设置环境变量JAVA_OPTS。
JAVA_OPTS='-Xmx512m'
我还没有找到一种方法来执行此操作作为命令参数。
答案 6 :(得分:5)
使用JAVA_OPTS进行环境变量设置。
使用-J-X选项为各个选项设置sbt,例如-J-Xmx2048 -J-XX:MaxPermSize = 512
较新版本的sbt具有“-mem”选项。
答案 7 :(得分:4)
当我们看到在通过sbt运行Specs2测试时抛出java.lang.OutOfMemoryError时,@ iwein上面引用的build.sbt中的javaOptions += "-XX:MaxPermSize=1024"
为我们工作。
答案 8 :(得分:3)
环境变量是_JAVA_OPTIONS,需要设置。 一旦设置了_JAVA_OPTIONS,当你sbt时,sbt将使用JAVA_OPTIONS和值显示消息。
或者,您可以在sbt或.scala文件中设置javaOption 例如
javaOptions += "-Xmx1G"
从sbt shell可以运行show javaOptions来查看设置的值。
答案 9 :(得分:1)
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