SBT 子项目内存不足

SBT out of memory with subprojects

我们在 CircleCI 上使用 SBT 0.13 和 Java 8 JVM 来构建一个包含多个子项目的 Play 应用程序。我们偶尔会在 CircleCI 上遇到内存不足的问题,因为它超过了 4 GB 的内存使用量而中止了我们的构建。

昨天,我在构建中添加了一个新的子项目,现在几乎所有构建都因内存不足问题而失败。看起来添加子项目也会增加我们构建所用的内存量。

我尝试了几种方法来减少内存负载:

所有这些措施似乎都有帮助,但我还没有找到解决这个问题的最终方法。

我还能做些什么来控制 SBT 的内存使用量?

编辑:我们的项目有 5 个子项目,大约有 14000 行 Scala 代码(还有 21000 行 Java 我们 'inherited' ).内存不足通常(但不总是)发生在使用 FindBugs 执行静态分析时:我们将其与 FindSecurityBugs 插件结合使用来查找安全问题。

这里有两个问题混杂在一起:

  1. Circle CI 未获取内存限制的值

  2. SBT 使用过多内存

第一个问题必须通过查看 CircleCI 文档/示例来解决。要调查你为什么使用这么多内存,你可以 运行 你的本地 sbt 内存限制低于 4g(即 2g)。您会发现自己处于以下两种情况之一:

  1. 您的测试确实使用了太多内存,可能是因为内存泄漏。您的 JVM 因 java.lang.OutOfMemoryError: GC overhead limit exceeded 而退出。您应该 运行 使用分析器在本地构建,看看是什么导致了您的问题(数据库连接未关闭?)

  2. 由于 SBT 动态重新加载 classes 的能力,您的测试使用了太多内存:在 SBT 中是否可以完全重新加载 class相同的 JVM(例如,您可以启动控制台、加载 class、编辑文件、重新编译并重新启动控制台并重新加载 class)。如此处的 Oracle 文档中所述,Java 8 中的 Maximum MetaSpace 没有限制,您应该设置一个,以便您的堆 + 元空间 < 4gb。参见 https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent