Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在docker环境中解决gradle被破坏的问题?_Docker_Jenkins_Gradle - Fatal编程技术网

如何在docker环境中解决gradle被破坏的问题?

如何在docker环境中解决gradle被破坏的问题?,docker,jenkins,gradle,Docker,Jenkins,Gradle,Gradle不能在docker环境中正常工作,它注定会使用太多内存,并因使用太多内存而被杀死 内存管理器使用以下类获取其快照 特别是Gradle通过读取/proc/meminfo来确定剩余的可用内存量,这在容器中提供了不准确的读取 Gradle仅在请求生成一个具有更大最小堆大小的新工作进程守护进程时,才会关闭工作进程守护进程,然后根据此读数,该工作进程守护进程才可用 因此,Gradle将继续制造工人,直到它用完容器的所有数量并被杀死 有人对此有解决办法吗?我真的不明白为什么这对更多的人来说不是

Gradle不能在docker环境中正常工作,它注定会使用太多内存,并因使用太多内存而被杀死

内存管理器使用以下类获取其快照

特别是Gradle通过读取/proc/meminfo来确定剩余的可用内存量,这在容器中提供了不准确的读取

Gradle仅在请求生成一个具有更大最小堆大小的新工作进程守护进程时,才会关闭工作进程守护进程,然后根据此读数,该工作进程守护进程才可用

因此,Gradle将继续制造工人,直到它用完容器的所有数量并被杀死

有人对此有解决办法吗?我真的不明白为什么这对更多的人来说不是个问题。我想,只有当您的工作进程不能被重用,从而创建了新的工作进程时,这才真正成为一个问题,因为我有大量的模块

我有一个临时解决方案,其中我给每个jvm一个巨大的-Xms,因此它总是触发minheap size>available,因此总是删除以前的工作进程守护进程,但这并不令人满意

--编辑


为了抢占某些东西,-max-workers不影响允许存在的工作进程的数量,它只影响允许活动的工作进程的数量。即使使用--max workers=1,它也允许有任意多个空闲的工作进程守护进程。

编辑-忽略下面的内容,这在某种程度上是可行的,但我通过覆盖MemInfoOsMemoryInfo类来修补Gradle,效果更好。将很快提供到Gradle的MR的链接

找到一个合理的解决方法,我们监听操作系统内存更新,每次任务完成时,我们请求的内存超过确定的可用内存,确保守护进程停止

import org.gradle.process.internal.health.memory.OsMemoryStatus
import org.gradle.process.internal.health.memory.OsMemoryStatusListener
import org.gradle.process.internal.health.memory.MemoryManagertask 

task expireWorkers {
    doFirst {
        long freeMemory = 0

        def memoryManager = services.get(MemoryManager.class)
        gradle.addListener(new TaskExecutionListener() {
            void beforeExecute(Task task) {
            }
            void afterExecute(Task task, TaskState state) {
                println "Freeing up memory"
                memoryManager.requestFreeMemory(freeMemory * 2)
            }
        })
        memoryManager.addListener(new OsMemoryStatusListener() {
            void onOsMemoryStatus(OsMemoryStatus osMemoryStatus) {
                freeMemory = osMemoryStatus.freePhysicalMemory
            }
        })
    }
}

问题是Gradle使用了太多的内存,生成了太多的守护进程,还是没有看到比它想象的更多的可用内存?在任何情况下,您是否考虑过只使用
--不使用守护进程来关闭守护进程?您是否也确定所有模块都需要不同的JVM设置来构建?如果您可以将它们对齐,Gradle将不会生成多个守护程序。@BjørnVester问题是,它使用了太多的内存,这是因为生成了太多的守护程序而没有杀死旧的守护程序,这是因为它错误地确定了剩余的可用内存量。我没有开启守护进程,但这只会影响“主”守护进程,即协调一切的守护进程。即使没有守护进程,仍然会有许多工作进程。我不确定我的所有模块是否都需要不同的JVM设置,但Gradle用来确定现有守护进程工作程序是否兼容的一件事是它的类加载器层次结构。感谢您的建议,不幸的是,它不起作用。gradle守护进程几乎总是在消失。我同意你的看法,这件事没有得到更多的关注,这很奇怪。也许你可以在你的问题中编辑,这个问题只有在你限制容器的内存时才会出现。@user1259201它对我来说也不是很好。从那以后,我就开始使用Gradle并编写了一个运行良好的补丁程序!我将提供一个链接,一旦我有一个先生到格拉德尔。