如何针对构建持续时间和RAM使用优化gradle构建性能?

pet*_*erp 39 heap performance build gradle

我目前正在从我的多模块Web应用程序的ant转换为gradle,目前似乎当前版本的Gradle(M9)可能正在运行它的极限.但也许(希望)这只是一个问题,我不能理解Gradle的概念,或者不了解"魔术性能提升开关".我很高兴有关如何优化构建性能的任何暗示.

问题:在compileJava显示第一个问题之前经过几分钟,即使源中没有任何变化,该过程至少运行7分钟,直到它在中途崩溃:testClasses(在不同的子项目中),并显示以下消息:

* What went wrong:
Could not resolve all dependencies for configuration ':mysubproject_X:testRuntime'.
> Java heap space
Run Code Online (Sandbox Code Playgroud)

该项目由大约30个(部分相互依赖的)子项目组成,它们的build.gradle或多或少相同,用于从每个子项目构建jar文件,例如

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 {
}
Run Code Online (Sandbox Code Playgroud)

我试图通过将最大内存大小增加到1024M来解决堆空间问题,但它没有帮助.我的main build.gradle文件如下所示:

            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'
            }
Run Code Online (Sandbox Code Playgroud)

Pet*_*ser 58

您需要为Gradle JVM提供更多内存,而不是为编译任务/ JVM提供更多内存.一种方法是通过GRADLE_OPTS环境变量(GRADLE_OPTS=-Xmx512m).

  • 谢谢,如建议的那样将GRADLE_OPTS设置为-Xmx512m不仅消除了堆空间错误,而且还极大地加速了这一过程.它仍然需要相当长的时间来进行构建,在某些时候我不太确定Gradle在后台做了什么,但是我可以继续使用这里的探查器:) (3认同)

Dav*_*son 25

如果使用的摇篮包装可以设置DEFAULT_JVM_OPTSgradlew这样的:

DEFAULT_JVM_OPTS="-Xmx512m"
Run Code Online (Sandbox Code Playgroud)

gradlew.bat如果您在Windows上,请以类似的方式设置它:

set DEFAULT_JVM_OPTS=-Xmx512m
Run Code Online (Sandbox Code Playgroud)

还可以修改Gradle Wrapper任务以自动包含此任务.这就是Gradle开发人员解决它的方式:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)


Dus*_*vic 7

我刚刚发现了一个非常好的方法来处理这个问题.无需自定义gradle包装器或GRADLE_OPTIONS.

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

使用--info选项运行Gradle,以查看将参数用于最大内存大小的位置.

gradle build --info
Run Code Online (Sandbox Code Playgroud)


sil*_*war 5

我使用以下版本的gradle.properties在Android项目中使Gradle性能更好

# 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
Run Code Online (Sandbox Code Playgroud)