【问题标题】:High memory usage by gradle daemongradle daemon 占用大量内存
【发布时间】:2015-12-16 14:40:10
【问题描述】:

我正在使用 Gradle 2.5 编译一个包含 5 个模块的 Java 项目。为了加快速度,我还使用了 gradle-daemon。但是,在编译期间,最多运行 18 个 gradle-daemon 实例。编译完成后,还剩下 15 个守护进程实例。守护进程消耗大约 600 MB 的 RAM。后台运行这么多守护进程是正常的还是 gradle-daemon 配置错误?

更新: 我的操作系统是 Debian Jessie。 Java 版本为 Oracle Java 8。

【问题讨论】:

  • 不,不正常。你是如何启动你的构建的?来自 CLI 还是 Android Studio?
  • 我正在使用 CLI。我发出的命令是“./gradlew build”
  • 那我不确定你是否使用了守护进程——这应该设置 gradle 的全局配置以使用守护进程并省略 daemon 参数。试试./gradle build --daemon
  • 我的 $HOME/.gradle/gradle.properties 文件中有以下内容:“org.gradle.daemon=true”。每当我在启动后开始构建时,我都会从 gradle 收到消息,即后续构建会更快,因为守护程序现在正在运行。我还可以看到带有“htop”的守护线程。无论如何,我在杀死守护进程后发出了你的命令。相同的行为。多个守护线程再次启动,守护进程的内存消耗仍然是 ca。 600 兆字节。
  • 这很奇怪,看起来一切都很好。一般来说,新的守护进程在已经运行时启动是“不兼容”的,这主要意味着构建是使用不同的 JVM 配置(如最大内存等)运行的。您应该尝试在 gradles 支持网站discuss.gradle.org 上发布问题

标签: java gradle gradle-daemon


【解决方案1】:

按照 Antoniossss 的建议,我联系了一位开发人员。事实证明,Gradle 实际上非常消耗资源。即使对于一个简单的“Hello World”应用程序,守护程序也可能使用高达 150 MB 甚至更多的内存。 启动多个守护线程也没关系,只要它们在同一个JVM中运行。 用户侧只有有限的控制来控制/限制内存使用。 可以设置 GRADLE_OPTS 变量以便将 Xmx 选项传递给 JVM,例如,我设法使用以下设置构建了我的 Android 项目:

$ export GRADLE_OPTS="-Xmx64m -Dorg.gradle.jvmargs='-Xmx256m -XX:MaxPermSize=64m'"

第一个 -Xmx 选项是为您在 CLI 中启动的 Gradle 设置的,第二个(在 -Dorg.gradle.jvmargs 之后)是 Gradle-Daemon 的 -Xmx 值。

您允许 JVM 使用的内存越少,构建失败的风险就越高 - 显然。因此,您可能需要调整这些设置,直到它们适合您的目的。

这些设置也可以在 gradle.properties 文件中设置。

【讨论】:

  • 谢谢你,但我不同意“你为 JVM 留出的内存越少,你的构建失败的风险就越高——显然。” - 我的构建失败,因为构建占用了太多内存,并且 Docker 映像配置为不允许更多。
猜你喜欢
  • 2014-05-11
  • 2011-02-27
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多