Увеличение пространства PermGen для Дженкинса / Gradle
Я управляю сборкой Jenkins проекта Android на Mac Mini (10.9.5). Сборка Jenkins терпит неудачу с сообщениями об ошибках как это:
<package>.myTest > test_myTest FAILED
org.mockito.cglib.core.CodeGenerationException at test_myTest.java:65
Caused by: java.lang.reflect.InvocationTargetException at test_myTest.java:65
Caused by: java.lang.OutOfMemoryError at test_myTest.java:65
java.lang.OutOfMemoryError: PermGen space
За этим иногда следуют сообщения типа
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "/0:0:0:0:0:0:0:1:50340 to /0:0:0:0:0:0:0:1:50339 workers Thread 2"
16:47:17
16:47:17 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "/0:0:0:0:0:0:0:1:50340 to /0:0:0:0:0:0:0:1:50339 workers Thread 4"
16:47:18
16:47:18 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "/0:0:0:0:0:0:0:1:50340 to /0:0:0:0:0:0:0:1:50339 workers Thread 5"
16:47:18
16:47:18 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "/0:0:0:0:0:0:0:1:50340 to /0:0:0:0:0:0:0:1:50339 workers Thread 6"
16:47:19
Как правило, происходит сбой в той же точке сборки. По словам вики Дженкинса
Вы постоянно видите OOME на одном и том же этапе сборки? Если так, то, возможно, ему просто нужно больше памяти.
это может означать, что мне просто нужно больше места в PermGen.
Сообщения в стеке, которые я читал, показывают, что мне нужно увеличить максимальный размер PermGen (-XX:MaxPermSize=1024M
, например). Однако мне не ясно, где это сделать.
Я изменил это для GRADLE_OPTS
а также JAVA_OPTS
поэтому моя среда сборки Jenkins выглядит следующим образом:
Как видно на скриншоте, я также добавил некоторые опции для сборки мусора Perm Gen, как рекомендовано здесь.
Похоже, это сработало - вчера у меня было несколько успешных сборок, но теперь снова происходит сбой (без каких-либо изменений, о которых я знаю).
Прочитав этот ответ, я также изменил следующую строку в моем проекте gradle.properties
файл.
org.gradle.jvmargs=-Xms1024M -Xmx2048M -XX:PermSize=512M -XX:MaxPermSize=2048 -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Это не решило проблему.
Ответы на подобные вопросы, подобные этому, и это заставляет меня думать, что я, возможно, подхожу к этому неправильно - стоит ли менять настройки компьютера для Mac (10.9.5), на котором работает Jenkins? Как правильно изменить пространство PermGen?
Изменить: Ранее я думал, что, возможно, переменные среды не были установлены, но я убедился, что они появляются под результатом сборки Переменные среды (jenkins/job/<Project>/146/injectedEnvVars/
)
2 ответа
Как сказал Integrating Stuff, необходимо было увеличить MaxPermSize для модульных тестов. Я нашел, как это сделать здесь, в разделе "Запуск из Gradle".
android {
testOptions {
unitTests.all {
jvmArgs '-XX:MaxPermSize=1024m' //prevent OOM (PermGen space) while running tests
}
}
...
}
Настройки памяти устанавливаются для каждого запущенного процесса JVM. Так что вам определенно не нужно устанавливать какие-либо переменные ОС или общесистемные настройки, чтобы это исправить.
Сначала нужно определить, какой процесс выдает ошибку. Я предполагаю, что это сборка Gradle, а не сама Jenkins. Это сборка Gradle, вы еще не знаете, какой процесс.
По умолчанию задача Gradle Test выполняет тесты в отдельной jvm, поэтому изменение значений в gradle.properties не поможет вам в этом случае. В таком случае вам необходимо правильно настроить задачу Gradle Test, например:
test {
jvmArgs "-XX:MaxPermSize=2048m"
}