jqn*_*qno 7 scala out-of-memory sbt
我们在CircleCI上使用SBT 0.13和Java 8 JVM来构建一个包含多个子项目的Play应用程序.我们偶尔会在CircleCI上出现内存问题,因为它超过了4 GB的内存使用量而中断了我们的构建.
昨天,我在构建中添加了一个新子项目,现在几乎所有构建都因内存不足问题而失败.看起来添加子项目也会增加用于构建的内存量.
我已经尝试了几种方法来减少内存负载:
_JAVA_OPTIONS: "-Xms512m -Xmx2048"到circle.yml对所描述的CircleCI的文档页面.(我从日志中注意到JVM确实接受了这个设置.)-mem参数添加到SBT调用.concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)到SBT文件的顶部,以确保至少一次不使用所有内存.所有这些措施似乎都有所帮助,但我还没有找到解决这个问题的最终方法.
我还能做些什么来控制SBT的内存使用?
编辑:我们的项目有5个子项目,大约有14000行Scala代码(以及我们继承的21000行Java代码).在使用FindBugs执行静态分析时,通常会(但不总是)发生内存不足:我们将其与FindSecurityBugs插件结合使用以查找安全问题.
这里有两个问题正在变得复杂:
Circle CI 未获取内存限制值
SBT 使用过多内存
第一个问题必须通过查看 CircleCI 文档/示例来解决。要调查为什么使用这么多内存,您可以在内存限制低于 4g(即 2g)的情况下本地运行 sbt。您会发现自己处于以下两种情况之一:
您的测试确实使用了太多内存,可能是因为内存泄漏。您的 JVM 由于java.lang.OutOfMemoryError: GC overhead limit exceeded. 您应该使用分析器在本地运行构建,并查看导致问题的原因(数据库连接未关闭?)
由于 SBT 能够动态重新加载类,您的测试使用了太多内存:在 SBT 中,是否可以在同一个 JVM 内完全重新加载类(即,例如您可以启动控制台、加载类、编辑文件,重新编译并重新启动控制台并重新加载该类)。正如 Oracle 文档中所述,Java 8 中没有限制Maximum MetaSpace,您应该设置一个,以便堆 + 元空间 < 4GB。请参阅https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent