为什么我的 Kotlin Gradle 构建会终止并显示退出代码 137?

Ste*_*imm 3 gradle kotlin

在运行 Kotlin 代码库测试时,我们在 CI 环境中看到了神秘的故障。

gradle test编译代码和测试都很好。测试进行了,一切似乎都通过了。但随后 Gradle 退出并返回代码 137(表明它被 SIGKILL 杀死),CI 系统因此认为构建失败。

限制 Gradle 的 JVM 大小并没有帮助。--no-daemon和选项也没有--max-workers

这是在 Java 8 JVM 上使用 Kotlin 1.2.40 和 Gradle 4.3。

Ste*_*imm 7

这个案例的罪魁祸首竟然是 Kotlin 编译器。

默认情况下,Kotlin 编译器在后台生成一个守护进程,以便后续编译作业更快。对于大小不小的 Kotlin 代码库,此过程最终可能会占用大量内存。

它的存在导致 Gradle 达到 CI 容器的内存限制,并且Linux OOM 杀手正在终止 Gradle 进程。

解决方案:告诉 Kotlin 编译器不要生成后台进程。事实证明,这是设置环境变量的简单问题:

GRADLE_OPTS=-Dkotlin.compiler.execution.strategy=in-process

有了该变量,Kotlin 编译就会在 Gradle JVM 中内联运行,因此当 Gradle 继续运行测试时,可以对其数据进行垃圾收集。

gradle将选项传递给命令而不是在环境中设置它也可以。

  • 我和 Gradle 团队谈过。他们建议使用默认守护进程。基本上,kotlin 编译器将在自己的守护进程中运行,这可以通过特定于 kotlin 编译器的预热节省大量时间。您可以使用 -Dkotlin.daemon.jvm.options=-Xmx6g 增加编译器守护程序的内存。下面的文章 https://dev.to/martinhaeusler/is-your-kotlin-compiler-slow-here-sa-pottial-fix-4if4 (2认同)