2012-03-21 9 views
36

Tôi hiện đang chuyển từ ant sang gradle cho ứng dụng web đa mô-đun của mình và tại thời điểm này có vẻ như phiên bản Gradle hiện tại (M9) có thể đang chạy ngược với giới hạn của nó. Nhưng có lẽ (hy vọng) nó chỉ là một vấn đề của tôi không hiểu các khái niệm của Gradle đủ tốt hay không biết "chuyển đổi tăng cường hiệu suất ma thuật". Tôi muốn được hạnh phúc cho bất kỳ gợi ý về cách hiệu suất xây dựng có thể được tối ưu hóa.Làm thế nào để tối ưu hóa hiệu suất xây dựng gradle liên quan đến thời gian xây dựng và sử dụng RAM?

Các sự cố: vài phút trôi qua trước khi compileJava được hiển thị và thậm chí nếu không có gì thay đổi trong nguồn, quá trình đang chạy ít nhất 7 phút cho đến khi nó bị treo nửa chừng :testClasses (tại các tiểu dự án khác nhau) với thông báo sau : dự án

* What went wrong: 
Could not resolve all dependencies for configuration ':mysubproject_X:testRuntime'. 
> Java heap space 

gồm khoảng 30 (một phần phụ thuộc lẫn nhau) tiểu dự án, các build.gradle trong số đó là nhiều hơn hoặc ít hơn như nhau và được sử dụng để xây dựng một file jar từ mỗi tiểu dự án, ví dụ:

sourceSets { 

    main { 
     java { 
      srcDirs 'src' 
     } 
    } 
} 

dependencies { 

    compile project(':mysubproject_A') 
    compile project(':mysubproject_B') 
    compile project(':mysubproject_E') 

    compile group: 'commons-lang', name: 'commons-lang', version: '2.2' 

} 

// copy all non-java files from src 
copy { 
    from sourceSets.main.java.srcDirs 
    into "$buildDir/classes/main" 
    exclude '**/*.java' 
} 

jar { 
} 

Tôi đã cố gắng giải quyết vấn đề về không gian heap bằng cách tăng kích thước bộ nhớ tối đa lên 1024M nhưng không hiệu quả. Tệp build.gradle chính của tôi trông giống như sau:

  sourceCompatibility = 1.6 
      version = 0.5 

      useFindBugs = false 

      apply plugin: 'java' 

      configurations { 
      } 

      repositories { 
       mavenCentral() 
       mavenRepo url:"http://repository.jboss.org/maven2", artifactUrls: ["https://repository.jboss.org/nexus/content/repositories/public","http://opensource.55minutes.com/maven-releases"] 
      } 


      dependencies { 
      } 

      buildscript { 
       repositories { 
        mavenRepo url: 'http://gradle.artifactoryonline.com/gradle/plugins' 
        flatDir(dirs: "$projectDir/lib") 
       } 

       dependencies { 
        classpath "org.gradle.plugins:gradle-idea-plugin:0.3.1" 
       } 
      } 

      subprojects { 
       apply plugin: 'java' 
       apply plugin: 'idea' 

       repositories { 
        mavenCentral() 
        mavenRepo url:"http://repository.jboss.org/maven2", artifactUrls: ["https://repository.jboss.org/nexus/content/repositories/public","http://opensource.55minutes.com/maven-releases"] 
       } 

       dependencies { 
        testCompile 'junit:junit:4.8.2' 
       } 

       compileJava { 
        options.encoding = 'UTF-8' 
        options.fork (memoryMaximumSize: '1024m') 
       } 

       javadoc { 
        options.encoding = 'UTF-8' 
       } 

       test { 
        testReportDir = file(rootProject.testReportDir) 
        forkEvery = 1 
        jvmArgs = ['-ea', '-Xmx1024m'] 
       } 
      } 


      dependsOnChildren() 

      task wrapper(type: Wrapper) { 
       gradleVersion = '1.0-milestone-9' 
      } 
+1

Bạn có xảy ra để được thay thế thẻ? Tôi đã tìm thấy điều này là một trong những điều mà gây ra đa dự án Gradle xây dựng được một thứ tự của cường độ chậm hơn bởi vì chúng tôi đã làm thay thế mã thông qua bộ nhớ cache .gradle. –

+0

Cảm ơn đề xuất của bạn. Tuy nhiên, không có thay thế nào liên quan. Câu trả lời của Peter Niederwieser dưới đây đã thực hiện thủ thuật :) – peterp

Trả lời

52

Bạn cần cung cấp thêm bộ nhớ cho JVM Gradle, không phải cho tác vụ biên dịch/JVM. Một cách để làm như vậy là thông qua biến môi trường GRADLE_OPTS (GRADLE_OPTS=-Xmx512m).

+3

Cảm ơn, thiết lập GRADLE_OPTS thành -Xmx512m như đề xuất không chỉ loại bỏ lỗi Heap Space, mà còn đẩy nhanh tiến trình lên rất nhiều. Nó vẫn mất khá nhiều thời gian để xây dựng và tại một số điểm tôi không thực sự chắc chắn Gradle đang làm gì ở chế độ nền, nhưng tôi có thể tiếp tục sử dụng profiler từ đây :) – peterp

+0

Khi đặt thành 512, tôi gặp lỗi tương tự lần nữa; Nhưng khi tôi đặt nó cho ví dụ 2048, tôi nhận được "Không thể dành đủ không gian cho 2097152" –

23

Nếu sử dụng Gradle Wrapper bạn có thể đặt DEFAULT_JVM_OPTS trong gradlew như thế này:

DEFAULT_JVM_OPTS="-Xmx512m" 

Set nó trong một thời trang tương tự như trong gradlew.bat nếu bạn đang ở trên Windows:

set DEFAULT_JVM_OPTS=-Xmx512m 

Nhiệm vụ Gradle Wrapper cũng có thể được sửa đổi để bao gồm điều này tự động. Đây là cách Gradle developers đã giải quyết được:

wrapper { 
    gradleVersion = '1.8' 

    def jvmOpts = "-Xmx512m" 
    inputs.property("jvmOpts", jvmOpts) 
    doLast { 
     def optsEnvVar = "DEFAULT_JVM_OPTS" 
     scriptFile.write scriptFile.text.replace("$optsEnvVar=\"\"", "$optsEnvVar=\"$jvmOpts\"") 
     batchScript.write batchScript.text.replace("set $optsEnvVar=", "set $optsEnvVar=$jvmOpts") 
    } 
} 
+0

Sửa đổi nhiệm vụ trình bao bọc hoạt động như Gradle 2.9 cũng như – nerdherd

+0

Tôi đề nghị rằng khi bạn cung cấp đoạn mã, bạn cũng nên nêu rõ mối quan tâm của tệp và đường dẫn tệp của họ. –

+0

Điều này có thể được đặt trong bất kỳ tệp xây dựng Gradle nào, theo như tôi nhớ. –

5

Tôi vừa tìm ra cách rất hay để xử lý vấn đề này. Không cần phải có trình bao bọc gradle tùy chỉnh hoặc GRADLE_OPTIONS.

compileJava { 
    options.fork = true // Fork your compilation into a child process 
    options.forkOptions.setMemoryMaximumSize("4g") // Set maximum memory to 4g 
} 

Chạy Gradle với tùy chọn --info để xem nơi nó sẽ sử dụng thông số của bạn cho kích thước bộ nhớ tối đa.

gradle build --info 
4

Trong gradle.properties tập thêm dòng sau:

org.gradle.daemon = true

này sẽ thúc đẩy việc xây dựng - lấy từ

https://www.timroes.de/2013/09/12/speed-up-gradle/

+0

Dường như quá tải kích thước heap java tại điểm, sau một lúc đã xóa nó, hãy suy nghĩ về ổ SSD cho đến khi giai đoạn tiếp theo của hiệu suất –

+0

daemon gradle được bật theo mặc định –

1

Không ai trong số các câu trả lời ở trên làm việc cho tôi, sau đó tôi tìm thấy this-

System Configuration My

-

Windows x64 - JDK 32 bit - Cordova 5.4.1 - Ionic 1.7.12 

tùy chọn JVM để chạy Gradle có thể được thiết lập thông qua các biến môi trường. Bạn có thể sử dụng GRADLE_OPTS hoặc JAVA_OPTS hoặc cả hai. JAVA_OPTS là quy ước một biến môi trường được chia sẻ bởi nhiều ứng dụng Java. Một trường hợp sử dụng điển hình sẽ là đặt proxy HTTP trong JAVA_OPTS và các tùy chọn bộ nhớ trong GRADLE_OPTS. Các biến này cũng có thể được đặt ở đầu tập lệnh gradle hoặc gradlew.

tôi thêm dưới đây đề cập đến hai Environment Variables và giải quyết này issue-

Variable Name: GRADLE_OPTS 
Variable Value: -Xmx512m 

Variable Name: JAVA_OPTS 
Variable Value: -Xmx512m 

Hope this helps để kẻ như tôi.

3

Tôi đang sử dụng phiên bản của gradle.properties sau để làm cho hiệu suất tốt hơn Gradle trong Android dự án

# The Gradle daemon aims to improve the startup and execution time of Gradle. 
# When set to true the Gradle daemon is to run the build. 
org.gradle.daemon=true 

# Specifies the JVM arguments used for the daemon process. 
# The setting is particularly useful for tweaking memory settings. 
# Default value: -Xmx10248m -XX:MaxPermSize=256m 
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 

# When configured, Gradle will run in incubating parallel mode. 
# This option should only be used with decoupled projects. More details, visit 
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 
org.gradle.parallel=true 

# Enables new incubating mode that makes Gradle selective when configuring projects. 
# Only relevant projects are configured which results in faster builds for large multi-projects. 
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand 
org.gradle.configureondemand=true 
1

Đặt nội dung sau đây để ~/.gradle như gradle.properties

# Project-wide Gradle settings. 
# IDE (e.g. Android Studio) users: 
# Settings specified in this file will override any Gradle settings 
# configured through the IDE. 
# For more details on how to configure your build environment visit 
# http://www.gradle.org/docs/current/userguide/build_environment.html 
# The Gradle daemon aims to improve the startup and execution time of Gradle. 
# When set to true the Gradle daemon is to run the build. 
# TODO: disable daemon on CI, since builds should be clean and reliable on servers 
org.gradle.daemon=true 
# Specifies the JVM arguments used for the daemon process. 
# The setting is particularly useful for tweaking memory settings. 
# Default value: -Xmx10248m -XX:MaxPermSize=256m 
org.gradle.jvmargs=-Xmx6g -Xms4g -XX:MaxPermSize=8g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 
# When configured, Gradle will run in incubating parallel mode. 
# This option should only be used with decoupled projects. More details, visit 
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 
org.gradle.parallel=true 
# Enables new incubating mode that makes Gradle selective when configuring projects. 
# Only relevant projects are configured which results in faster builds for large multi-projects. 
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand 
org.gradle.configureondemand=true 
+0

Bật daemon gradle hoạt động tốt để tăng tốc độ nói chung. Mỗi khi bạn gọi gradle, nó phải tải và phân tích cú pháp tệp xây dựng, sau đó nó có thể bắt đầu thực hiện. Daemon sẽ tải/phân tích và lưu trữ dữ liệu được phân tích cú pháp. Lời gọi tiếp theo, nếu tệp xây dựng không thay đổi, nó sẽ nhanh hơn MUCH. Nó không thành công, mặc dù, nếu bạn từng làm "gradle --debug " bởi vì bạn đang cố gắng để xem classpath là, những gì giá trị các biến có, vv Bạn phải tắt daemon trong cấu hình, giết -9 quá trình THEN làm --debug THEN, sau khi hoàn tất gỡ lỗi, hãy bật lại nó trong cấu hình. – Meower68

2

Cá nhân tôi đã đi qua tất cả các bài viết ở đây nhưng thực hiện các bước này đã sửa nó.

Nếu bạn đang sử dụng 32 bit jvm có thể là vấn đề cài đặt jvm 64 bit.

  1. Đến bảng điều khiển (search java trong các cửa sổ 10)
  2. tìm ứng dụng java
  3. Kích đúp vào java và sau đó xem.
  4. Trong các thông số thời gian chạy thêm:

    -Xmx 2048m 
    
+0

Đối với bất kỳ ai tìm kiếm "tham số thời gian chạy", trong W7, điều này nằm trong tab "Java" khi bạn thực hiện bước 3, sau đó nhấp "Xem". Từ đó, "tham số thời gian chạy" sẽ được xem là một trong các ô trong lưới. – user1863152

+0

Cảm ơn bạn! Tôi đã cài đặt 32bit và 64bit Java và sử dụng 32 bit thay vì 64bit. – blk0ut