为Jenkins / gradle增加PermGen空间

时间:2016-05-06 18:25:33

标签: android jenkins android-gradle permgen

我正在Mac Mini(10.9.5)上运行一个Android项目的Jenkins构建。 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 

它通常在构建中的同一点失败。根据{{​​3}}

  

你是否一直看到OOME在构建的同一阶段?如果是这样,也许它只需要更大的记忆。

这可能意味着我只需要更多的PermGen空间。

我读过的stackoverflow帖子/博客文章表明我需要增加最大PermGen大小(例如-XX:MaxPermSize=1024M)。但是,我不清楚在哪里这样做。

我已为GRADLE_OPTSJAVA_OPTS更改此内容,因此我的Jenkins构建环境如下所示: Jenkins wiki

如屏幕截图所示,我还添加了一些垃圾收集Perm Gen的选项environmental variables

这似乎有效 - 我昨天有一些成功的版本,但它现在再次失败(没有我所知的任何变化)。

阅读here后,我还在项目的gradle.properties文件中更改了以下行。

org.gradle.jvmargs=-Xms1024M -Xmx2048M -XX:PermSize=512M -XX:MaxPermSize=2048 -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

这还没有解决问题。

this answerthis等类似问题的回答让我觉得我可能会以错误的方式接近这个问题 - 我是否应该更改正在运行的Mac(10.9.5)的计算机设置詹金斯?修改PermGen空间的正确方法是什么?

编辑:我以前认为可能没有设置环境变量,但我确认它们出现在构建结果环境变量(jenkins/job/<Project>/146/injectedEnvVars/

之下

this java_opts

2 个答案:

答案 0 :(得分:1)

正如Integrating Stuff所说,有必要为单元测试增加MaxPermSize。我找到了如何在#34;从Gradle&#34运行中here。部分。

android {
    testOptions {
        unitTests.all {
            jvmArgs '-XX:MaxPermSize=1024m' //prevent OOM (PermGen space) while running tests
        }
    }
    ...
}

答案 1 :(得分:0)

每个正在运行的JVM进程设置内存设置。所以你绝对不需要设置任何操作系统变量或系统范围的设置来解决这个问题。

首先需要确定哪个进程引发了错误。 我假设它是Gradle构建而不是Jenkins本身。 它是Gradle构建,你仍然不知道哪个进程。

默认情况下,Gradle Test任务在单独的jvm中执行测试,因此在这种情况下更改gradle.properties中的值将无法帮助您。 在这种情况下,您需要正确配置Gradle Test任务,例如:

test {
    jvmArgs "-XX:MaxPermSize=2048m"
}