Подтвердить что ты не робот

Как оптимизировать gradle производительность сборки относительно продолжительности сборки и использования ОЗУ?

В настоящее время я перехожу из ant в gradle для моего веб-приложения с несколькими модулями, и в настоящий момент кажется, что текущая версия gradle (M9) может работать против ее пределов. Но, может быть, (надеюсь), это просто проблема, когда я не понимал понятия gradle достаточно хорошо или не знал "волшебный ускоритель повышения производительности". Я был бы рад за любой намек на то, как производительность сборки может быть оптимизирована.

Проблемы: несколько минут проходят до появления первого compileJava, и даже если в источниках ничего не изменилось, процесс выполняется не менее 7 минут, пока он не сработает на полпути через :testClasses (в разных подпроектах) с следующее сообщение:

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

Проект состоит из около 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 {
}

Я попытался решить проблему с кучей памяти, увеличив максимальный объем памяти до 1024 М, но это не помогло. Мой основной файл 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'
            }
4b9b3361

Ответ 1

Вам нужно предоставить больше памяти для JVM Gradle, а не для компилируемой задачи /JVM. Один из способов сделать это - переменная среды GRADLE_OPTS (GRADLE_OPTS=-Xmx512m).

Ответ 2

Если вы используете Gradle Wrapper, вы можете установить DEFAULT_JVM_OPTS в gradlew следующим образом:

DEFAULT_JVM_OPTS="-Xmx512m"

Установите его аналогичным образом в gradlew.bat, если вы находитесь в Windows:

set DEFAULT_JVM_OPTS=-Xmx512m

Задача Wrapper Gradle также может быть изменена, чтобы включить это автоматически. Вот как решили 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")
    }
}

Ответ 3

Я нашел очень хороший способ справиться с этой проблемой. Нет необходимости в пользовательской оболочке gradle или GRADLE_OPTIONS.

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

Запустите gradle с параметром -info, чтобы узнать, где он будет использовать ваш параметр для максимального объема памяти.

gradle build --info

Ответ 5

Я использую следующую версию gradle.properties, чтобы сделать производительность Gradle лучше в проектах Android

# 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

Ответ 6

Я лично просмотрел все статьи, но эти шаги исправили его.

Если вы используете 32-битный jvm, возможно, проблема заключается в установке 64-битного jvm.

  • Перейдите на панель управления (найдите java в окнах 10)
  • найти java-приложение
  • Дважды щелкните java, а затем просмотрите.
  • В параметрах времени выполнения добавьте:

    -Xmx 2048m
    

Ответ 7

Ни один из вышеперечисленных ответов не работал у меня, тогда я нашел это -

Моя конфигурация системы -

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

Параметры JVM для запуска Gradle могут быть установлены через переменные среды. Вы можете использовать либо GRADLE_OPTS, либо JAVA_OPTS, либо и то, и другое. JAVA_OPTS - это условная переменная среды, разделяемая многими приложениями Java. Типичным вариантом использования было бы установить прокси-сервер HTTP в JAVA_OPTS и параметры памяти в GRADLE_OPTS. Эти переменные также могут быть установлены в начале Gradle или gradlew script.

Я добавил следующие две переменные среды и решил эту проблему -

Variable Name: GRADLE_OPTS
Variable Value: -Xmx512m

Variable Name: JAVA_OPTS
Variable Value: -Xmx512m

Надеюсь, это поможет таким парням, как я.

Ответ 8

Поместите следующее содержимое в ~/.gradle как 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