【发布时间】:2021-03-05 15:33:59
【问题描述】:
Gradle 在 docker 环境下无法正常工作,注定会占用过多的内存而被杀掉。
内存管理器使用以下类获取其快照
尤其是 Gradle 通过读取 /proc/meminfo 来确定剩余多少可用内存,这会在容器中提供不准确的读取。
Gradle 仅在收到请求以创建具有更大最小堆大小的新 Worker Daemon 时才会杀死 Worker Daemons,然后根据此读数可用。
因此,Gradle 将继续制造工人,直到它用完容器的分配数量并被杀死。
有人对此有解决方法吗?真的不明白这对更多人来说如何不是问题。我想只有当你的工作守护进程不能被重用并创建新的守护进程时才会真正成为一个问题,这对我来说就是这种情况,因为我有大量的模块。
我有一个临时的解决方法,我给每个 jvm 生成一个巨大的 -Xms,所以它总是触发最小堆大小 > 可用,所以总是删除以前的工作守护进程,但这并不令人满意。
--编辑
为了抢占某些东西,--max-workers 不会影响允许存在的 Worker Daemon 的数量,它只会影响允许处于活动状态的数量。即使使用--max-workers = 1,也允许任意多个空闲的Worker Daemon。
【问题讨论】:
-
问题是 Gradle 使用了太多内存,它产生了太多守护进程,还是它没有看到比它想象的更多的可用内存?无论如何,您是否考虑过使用
--no-daemon关闭守护进程?您还确定所有模块都需要不同的 JVM 设置来构建吗?如果你可以对齐它们,Gradle 将不会产生多个守护进程。 -
@BjørnVester 问题是它使用了太多的内存,这是由于产生了太多的守护进程而没有杀死旧的守护进程,这是由于错误地确定了剩余多少可用内存。我有 --no-daemon ,但这只会影响“主”守护进程,即协调一切的守护进程。即使使用 --no-daemon ,你仍然会得到许多工作守护进程。关于我的所有模块是否需要不同的 JVM 设置,我不确定,但 Gradle 用来确定现有守护进程是否兼容的一件事是它的类加载器层次结构。