sbt 有时可能会耗尽内存,导致崩溃或性能严重下降。sbt 需要多少内存取决于构建中的子项目数量和启用的插件。对于内存占用很大的项目,可能需要使用更大的 Java 堆大小启动 sbt。默认的 Java 堆大小为 1GB。要将其增加到 2GB,可以运行以下命令
sbt -J-Xmx2G
任何以 -J
开头的命令行参数都被解释为 Java VM 参数。要在项目中自动将堆大小增加到 2GB,请创建或编辑文件 .sbtopts
并添加一行包含 -J-Xmx2G
的内容。
当 sbt 在交互模式下或作为服务器运行时(即它使用 sbt --client
或 sbtn
启动),构建中的每个任务都必须清理其所有资源,否则 sbt 的内存占用可能会随着时间的推移而增加。例如,如果 run 任务启动了 Akka ActorSystem,则必须在 run 退出之前关闭 ActorSystem,否则每次调用 run 时,sbt 进程的内存使用率都会增加。
为了修复内存泄漏,有必要找出哪些类在内存中的持久时间超过预期。最简单的方法是使用 jmap 命令(由 jdk 提供)和一个 JVM 内存分析工具,例如 VisualVM。使用 ps
命令查找要调试的 sbt 进程的进程 ID。然后运行 jmap -dump:format=b,file=leak.hprof $SBT_PID
。在 VisualVM 中打开 leak.hprof
文件。可能很明显哪些类占用了最多的内存,但有时需要单击“计算保留大小”按钮。如果堆很大,这可能需要一段时间,但它可以识别哪些类占用了最多的内存。通常这将有助于识别是否存在已泄漏的线程或未清除的缓存。