我正在使用我专门构建的 Scala 运行 SBT。我构建的Scala编译器会在运行时做很多事情,有很多函数调用,这些可以是递归的。
所以当我使用我构建的 Scala 编译器运行 SBT 时,很长一段时间后堆栈溢出。我尝试在启动 SBT 时设置 -J-Xss 。但这是行不通的。
我之前遇到过SBT堆大小的问题。许多帖子表示,启动 SBT 时设置 -J-Xmx 不会更改 JVM 堆大小,因为它会被默认的 SBT 内存选项覆盖。 如何设置sbt的堆大小?
现在,我想知道 -J-Xss 是否可以被默认的 SBT 选项覆盖,就像 -J-Xmx 被覆盖一样。或者我应该尝试将 -J-Xss 设置得更大?
有很多方法可以做到这一点,但这取决于您想要实现的目标。例如,如果您想要更大的堆来运行测试,请查看此处采用的第二种方法。
SBT_OPTS
首先,您可以简单地设置环境变量
SBT_OPTS
,SBT 在加载自身时会本机查找该变量,这应该会覆盖您想要指定的任何设置。
export SBT_OPTS = "-Xmx1G;-Xms256m;...";
自定义启动器
实现相同目的的另一种方法是创建自定义 SBT 启动脚本。看一下示例这里。
用于测试
如果要修改测试选项,则需要使用
javaOptions in ThisBuild ++= Seq("-Xmx1g", ...)
。为了让它们运行,你总是需要 fork in Test := true
,这将创建一个分叉的 JVM 来运行测试。否则,指定的选项将不会得到尊重。
您可以尝试使用 .jvmopts 文件,例如
-Dfile.encoding=UTF8
-Xss6M
-XX:ReservedCodeCacheSize=512m
-XX:+UseG1GC
.sbtopts 在 Windows 上可能会被忽略 https://github.com/sbt/sbt/issues/4919#issuecomment-544049693