Gradle翻譯——Gradle Daemon(守護進程)

第6章 Gradle守護進程

原文
歡迎關注公衆號:Glide風
這裏寫圖片描述
目錄

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的守護進程。

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等)環境以及通過命令行開關和設置明確構建的。有關如何指定和控制構建環境的詳細信息,請參見第11章 “構建環境”

以下JVM系統屬性實際上是不可變的。如果請求的構建環境需要這些屬性中的任何一個,並且當 Daemon的JVM所具有的屬性值與其不同時,則守護程序將不兼容。

  • file.encoding
  • user.language
  • user.country
  • 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對於大多數版本來說已經足夠了。更大的構建與數百個子項目,大量的配置和源代碼可能需要,或性能更好,更多的內存。

要增加守護程序可以使用的內存量,請將相應的標誌指定爲所請求的生成環境的一部分。有關詳細信息,請參閱第11章“構建環境 ”

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(請參閱第13章,使用Tooling API嵌入Gradle)始終使用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版本中實現更快的構建

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章