Ответ 1
Вам нужно предоставить больше памяти для JVM Gradle, а не для компилируемой задачи /JVM. Один из способов сделать это - переменная среды GRADLE_OPTS
(GRADLE_OPTS=-Xmx512m
).
В настоящее время я перехожу из 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'
}
Вам нужно предоставить больше памяти для JVM Gradle, а не для компилируемой задачи /JVM. Один из способов сделать это - переменная среды GRADLE_OPTS
(GRADLE_OPTS=-Xmx512m
).
Если вы используете 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")
}
}
Я нашел очень хороший способ справиться с этой проблемой. Нет необходимости в пользовательской оболочке 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.properties добавьте следующую строку:
org.gradle.daemon = истина
Это увеличит сборку из
Я использую следующую версию 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
Я лично просмотрел все статьи, но эти шаги исправили его.
Если вы используете 32-битный jvm, возможно, проблема заключается в установке 64-битного jvm.
В параметрах времени выполнения добавьте:
-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 script.
Я добавил следующие две переменные среды и решил эту проблему -
Variable Name: GRADLE_OPTS
Variable Value: -Xmx512m
Variable Name: JAVA_OPTS
Variable Value: -Xmx512m
Надеюсь, это поможет таким парням, как я.
Поместите следующее содержимое в ~/.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