Увеличение пространства 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/)

JAVA_OPTS gradle_opts

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"
}
Другие вопросы по тегам