Scala 如何指定JVM最大堆大小“-Xmx";用于运行带“的应用程序”;“运行”;SBT中的行动?
我的应用程序处理大型数据数组,需要比JVM默认提供的内存更多的内存。我知道在Java中它是由“-Xmx”选项指定的。如何设置SBT以使用特定的“-Xmx”值来运行具有“run”操作的应用程序?我知道一种方法。设置环境变量JAVA_OPTSScala 如何指定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项目的命令。请尝试以
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中为非分叉流程设置选项:
$ 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 "$@"
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
不推荐从SBT0.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