Как оптимизировать производительность сборки 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 {
}
Я попытался решить проблему с кучей памяти, увеличив максимальный объем памяти до 1024M, но это не помогло. Мой основной файл 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'
}
8 ответов
Вам нужно выделить больше памяти для Gradle JVM, а не для задачи компиляции /JVM. Один из способов сделать это через GRADLE_OPTS
переменная окружения (GRADLE_OPTS=-Xmx512m
).
При использовании Gradle Wrapper вы можете установить DEFAULT_JVM_OPTS
в gradlew
как это:
DEFAULT_JVM_OPTS="-Xmx512m"
Установите его аналогичным образом в gradlew.bat
если вы на Windows:
set DEFAULT_JVM_OPTS=-Xmx512m
Задача 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")
}
}
Я использую следующую версию 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
Я только что нашел очень хороший способ справиться с этой проблемой. Нет необходимости в пользовательской оболочке 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
Поместите следующий контент в ~/.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
В файле gradle.properties добавьте следующую строку:
org.gradle.daemon = верно
Это повысит сборку - взято из
Я лично просмотрел все статьи здесь, но эти шаги исправили это.
Если вы используете 32-битную версию jvm, это может быть проблемой, установите 64-битную версию jvm.
- Перейти к панели управления (поиск Java в Windows 10)
- найти приложение Java
- Дважды щелкните по Java, а затем просмотрите.
Во время выполнения параметры добавьте:
-Xmx 2048m
Ни один из приведенных выше ответов не работал для меня, тогда я нашел это
Конфигурация моей системы
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.
Я добавил следующие две переменные среды и решил эту проблему:
Variable Name: GRADLE_OPTS
Variable Value: -Xmx512m
Variable Name: JAVA_OPTS
Variable Value: -Xmx512m
Надеюсь, это поможет парням, как я.
Значение GRADLE_OPTS в gradlew было установлено для меня так раньше
DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
Это приводило к сбою compileJava, как показано ниже в Jenkin
Что пошло не так: не удалось выполнить задачу ':compileJava'. Превышен предел накладных расходов GC
Позже я изменил DEFAULT_JVM_OPTS, как показано ниже, чтобы добиться успеха при сборке Jekin -
DEFAULT_JVM_OPTS= "-Xmx512m" "-Xms64m"