译文——The Gradle Daemon(守护进程)

Posted Glide風

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了译文——The Gradle Daemon(守护进程)相关的知识,希望对你有一定的参考价值。

本文为docs.gradle.org上关于Gradle 第六章The Gradle Daemon的一篇译文,其原文出处:https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html


目录

6.1 启用守护进程 
6.2 停止现有的守护进程 
6.3 常问问题 
6.4 何时不应该使用Gradle守护进程? 
6.5 工具和IDE 

6.6 Gradle Daemon如何更快地构建?


From Wikipedia…

守护进程是一种作为后台进程运行的计算机程序,而不是由交互式用户直接控制。

Gradle在Java虚拟机(JVM)上运行,并使用一些支持库,这些库需要一定的初始化时间。因此,有时候看起来有点慢。解决这个问题的方法是启用Gradle Daemon(Daemon:一个长期的后台进程,比其他情况下执行你的构建要快得多)。我们通过避免昂贵的引导过程以及利用缓存来实现这一点,将有关项目的数据保存在内存中。运行Gradle与守护进程构建没有区别,进行简单地配置后无论你是否要使用它 都将由Gradle自行的处理。

6.1 启用守护进程

Gradle Daemon在默认情况下是不启用的,但是我们建议开发者的设备始终启用它(但是对于持续集成服务器,将其禁用)。启用守护进程有几种方法,但最常见的方法是添加该行:

org.gradle.daemon =true

到文件/.gradle/gradle.properties下进行配置, 所在位置取决于您的系统,通常如下:

  • C:\Users\ (Windows Vista&7+

  • /Users/ (Mac OS X)

  • /home/ (Linux)


注:<USER_HOME>为当前用户的主目录,比如:C:\Users\Administrator那么这个<USER_HOME>指的就是Administrator。

如果该文件不存在,只需使用文本编辑器创建。您可以在下面的FAQ中找到启用(和禁用)守护进程的其他方法的详细信息。该部分还包含关于守护进程如何工作的更多详细信息。


一旦以这种方式全局启用了守护进程,不管特定构建使用的Gradle版本如何,所有的构建速度都将提升。


6.2 停止现有的守护进程


如前所述,守护进程是一个后台进程。但是,您不需要担心该后台进程对性能的影响,每个守护进程在三小时不活跃的情况下会自行停止。如果您因为一些原因想要停止守护进程,请使用该命令为:gradle –stop。


这将终止所有用于执行命令的相同版本的Gradle启动的守护进程。如果安装了Java Development Kit(JDK),则可以通过运行jps命令轻松验证守护程序是否已停止。您将看到任何正在运行的名为GradleDaemon的守护进程。如前所述,守护进程是一个后台进程。但是,您不需要担心该后台进程对性能的影响,每个守护进程在三小时不活跃的情况下会自行停止。如果您因为一些原因想要停止守护进程,请使用该命令为:gradle –stop。


6.3 常问问题

6.3.1 启用Gradle Daemon的方法有哪些?

有两种建议的方式来持续为一个环境启用守护进程:

  • 通过环境变量 - 将标志添加-Dorg.gradle.daemon=true到GRADLE_OPTS环境变量

  • 通过属性文件 -添加org.gradle.daemon=true到/gradle.properties文件

请注意,<GRADLE_USER_HOME>默认为<USER_HOME>/.gradle,<USER_HOME>为当前用户的主目录,此位置可以通过-g和--gradle-user-home命令行开关以及GRADLE_USER_HOME环境变量和org.gradle.user.homeJVM系统属性进行配置。

两种方法都有相同的效果,根据个人喜好来使用。大多数Gradle用户选择第二种方法,并将条目添加到用户gradle.properties文件。


在Windows上,启用命令为:

(if not exist "%USERPROFILE%/.gradle" mkdir "%USERPROFILE%/.gradle") && 
(echo org.gradle.daemon=true >> "%USERPROFILE%/.gradle/gradle.properties")
 

    也就相当于,在C:\Users\.gradle文件下的gradle.properties(如果没有进行创建)中配置echo org.gradle.daemon=true 


    在Linux环境下:

    touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties


    一旦以这种方式为构建环境启用了守护进程,所有构建都将隐式使用Daemon。在个人的构建使用命令行界面时可以调用–daemon和–no-daemon命令行开关来启用和禁用守护程序。通常情况下,为一个环境(比如一个用户账号)启用守护进程会更方便,这样所有的版本都可以使用守护进程而不需要记住提供–daemon交换机。


    6.3.2 如何禁用Gradle守护进程?

     

    Gradle守护进程默认是不启用的。但是,一旦启用,有时需要禁用某些项目或某些构建时可以使用–no-daemon命令行开关进行强制禁用。

    该命令行很少使用,但是在调试某些构建或者Gradle插件的问题时有时会很有用。考虑到构建环境,该命令行开关的优先级最高。


    6.3.3 如何抑制“please consider using the Gradle Daemon”消息?


    Gradle可能会在构建结束时发出警告,提示您使用Gradle守护程序。为了避免这个警告,你可以通过上面的方法来启用守护进程,或者明确禁用守护进程。你可以明确地通过使用禁用守护进程–no-daemon如上所述命令行开关,或着开启的方法之一,但org.gradle.daemon属性的值应为false,而不是true

    由于不建议使用守护进程连续集成构建,所以如果CI环境变量存在,Gradle将不会发出消息。


    6.3.4 为什么我的机器上有多个守护进程?


    Gradle将创建一个新的守护进程有几个原因,而不是使用已经运行的守护进程。基本规则是:如果没有可用的空闲或兼容的守护进程,Gradle将启动一个新的守护进程。Gradle会杀死已经闲置3个小时以上的守护进程,所以你不必担心手动清理它们。


    一个空闲的守护进程是一个目前没有执行构建或做其他有用的工作。


    兼容 

    一个兼容的守护进程是可以(或可以做到)满足所要求的构建环境的要求的守护进程。用于执行构建的Java运行时是构建环境的示例方面。另一个示例是构建运行时所需的一组JVM系统属性。


    守护进程可能无法满足所请求的构建环境的某些方面。如果守护程序正在Java 7环境下运行,但所请求的环境需要Java 8,则守护进程不兼容,必须启动另一个。而且,一旦JVM启动,Java运行时的某些属性就不能被改变。例如不能改变-Xmx1024m正在运行的JVM 的内存分配,默认文本编码,缺省语言环境等。


    “requested build environmen”通常是由构建客户端(例如Gradle命令行客户端,IDE等)环境以及通过命令行开关和设置明确构建的。


    以下JVM系统属性实际上是不可变的。如果请求的构建环境需要这些属性中的任何一个,并且当 Daemon的JVM所具有的属性值与其不同时,则守护程序将不兼容。

    • file.encoding

    • user.language

    • user.variant

    • java.io.tmpdir

    • javax.net.ssl.keyStore

    • javax.net.ssl.keyStorePassword

    • javax.net.ssl.keyStoreType

    • javax.net.ssl.trustStore

    • javax.net.ssl.trustStorePassword

    • javax.net.ssl.trustStoreType

    • com.sun.management.jmxremote


    以下由启动参数控制的JVM属性也是不可变的。所请求的构建环境和守护进程环境的相应属性必须完全匹配,以使守护进程兼容。

    • 最大堆大小(即-Xmx JVM参数)

    • 最小堆大小(即-Xms JVM参数)

    • 引导类路径(即-Xbootclasspath参数)

    • “断言”状态(即-ea参数)


    Gradle版本和编译环境的版本不同是另一个方面。守护进程耦合到特定的Gradle运行时,在使用不同Gradle版本的会话期间处理多个Gradle项目是拥有多个运行中的守护进程的常见原因。


    6.3.5 Daemon 使用多少内存,我可以给它多一点?


    如果请求的构建环境没有指定最大堆大小,守护进程将使用最多1GB的堆。它将使用您的JVM的默认最小堆大小。1GB对于大多数版本来说已经足够了。更大的构建与数百个子项目,大量的配置和源代码可能需要,或性能更好,更多的内存。

    要增加守护程序可以使用的内存量,请将相应的标志指定为所请求的生成环境的一部分。

    6.3.6 怎样停止Daemon ?

    不活动3小时后,守护进程将自动终止。如果您希望在此之前停止守护进程,则可以通过操作系统终止进程或运行gradle –stop命令。该–stop开关使得Gradle请求运行该命令的相同Gradle版本的所有正在运行的Daemon进程自行终止。


    6.3.7 Daemon 有什么缺陷? 


    在守护进程日益发展的过程中,相当大的工程努力已经使守护进程变得健壮,透明和不显眼。但是,守护进程偶尔会被损坏或耗尽。Gradle构建执行来自多个源的任意代码。虽然Gradle本身是专门为Daemon设计的并且经过严格测试,但是用户构建脚本和第三方插件可能会通过内存泄漏或全局状态损坏等缺陷来破坏守护进程的稳定性。

    通过运行不能正确释放资源的构建,也可能会破坏守护进程的稳定性(通常会构建环境)。在使用Microsoft Windows时,这是一个特别棘手的问题,因为它对读取或写入后无法关闭文件的程序宽容。

    Gradle会主动监视堆的使用情况,并尝试检测泄漏是否开始耗尽守护进程中可用的堆空间。当它检测到堆空间的问题时,Gradle守护进程将完成当前正在运行的构建,并在下一个构建中重新启动守护进程。此监视默认启用,但可以通过将org.gradle.daemon.performance.enable-monitoring系统属性设置为false 来禁用。

    如果怀疑守护进程变得不稳定,可能会被简单地杀死。回想一下,–no-daemon可以为构建指定开关,以防止使用守护进程。这对于诊断守护进程是否真的是问题的罪魁祸首可能是有用的

    6.4 何时不应该使用Gradle守护进程?


    建议在所有开发人员环境中使用守护进程并且不要启用用于持续集成的守护进程并构建服务器环境。


    守护进程使构建更快,当人坐在构建前面时,这一点尤为重要。对于CI构建,稳定性和可预测性是至关重要的。对于每个构建使用全新的运行时(即进程)更加可靠,因为运行时与以前的构建完全隔离。

    6.5 工具和IDE 


    IDE和其他工具用于与Gradle集成 的Gradle Tooling API始终使用Gradle Daemon来执行构建。如果从内部执行Gradle构建,则您使用的是Gradle守护程序,无需为您的环境启用它。

    但是,除非您为您的环境明确启用了Gradle守护程序,否则命令行中的构建不会使用Gradle守护程序。

    6.6 Gradle Daemon如何更快地构建?

    Gradle守护进程是一个长期的构建过程。在构建之间,它等待下一个构建。这具有明显的好处,只需要将Gradle一次加载到多次构建中,而不是每次构建一次。这本身就是一个重要的性能优化,但这并不是停止的地方。

    现代JVM性能的一个重要部分是运行时代码优化。例如,HotSpot(Oracle提供的用作OpenJDK基础的JVM实现)在代码运行时对其进行优化。优化是渐进的而不是瞬时的。也就是说,代码在执行过程中被逐步优化,这意味着后续的构建可以更快地完成,纯粹是由于这个优化过程。HotSpot的实验表明,它需要5到10之间的构建优化来稳定。守护程序的第一次构建和第十次构建时间之间的差异可能相当大。

    守护进程还更有效的允许跨内存缓存。例如,构建所需的类(例如,插件,构建脚本)可以在构建之间保存在内存中。同样,Gradle可以维护内存缓存的构建数据,如任务输入和输出的散列,用于增量构建。

    6.6.1 潜在的未来增强

    目前,守护进程通过有效地支持内存缓存以及JVM优化器使代码更快,使构建更快。在未来的Gradle版本中,守护进程将变得更加智能,并且抢先进行工作。例如,假定构建即将运行,并且将需要新更改或添加的依赖关系,它可以在编译构建脚本之后立即开始下载依赖关系。

    Gradle Daemon还有很多其他的方法可以在未来的Gradle版本中实现更快的构建









    以上是关于译文——The Gradle Daemon(守护进程)的主要内容,如果未能解决你的问题,请参考以下文章

    写一个杀死Gradle Daemon的shell脚本和bat脚本

    Gradle 构建失败,出现错误“等待连接到 Grade 守护程序的超时”

    Unable to start the daemon process . This problem might be caused by incorrect configuration of the

    android studio错误:无法启动守护程序进程

    Error:Unable to start the daemon process.解决

    Error:Unable to start the daemon process. 解决