2016-05-06 40 views
0

我在Mac Mini上运行一个Jenkins版本的Android项目(10.9.5)。詹金斯构建与像这样的错误消息失败:为詹金斯/ gradle增加PermGen空间

<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 

它通常无法在构建的相同点。根据Jenkins wiki

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

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

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

我已经改变了这对GRADLE_OPTSJAVA_OPTS所以我的詹金斯生成环境是这样的: environmental variables

如截图所见,我还添加了一些选项,垃圾回收烫发根建议here

这似乎是行得通的 - 昨天我有一些成功的构建,但现在失败了(没有我知道的变化)。

读完this answer后,我在项目的gradle.properties文件中也更改了下面一行。

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

这并没有解决问题。

类似问题的答案,如thisthis让我觉得我可能正在接近这个错误的方式 - 我应该改变运行Jenkins的Mac(10.9.5)的计算机设置吗?什么是修改PermGen空间的正确方法?

编辑:我以前想过,也许环境变量没有被确定,但我证实它们出现在构建结果的环境变量(jenkins/job/<Project>/146/injectedEnvVars/

java_opts gradle_opts

回答

1

由于集成的东西说,有必要提高MaxPermSize参数进行单元测试。我发现如何在“从Gradle运行”部分中执行here

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

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

您首先需要确定哪个进程正在抛出错误。 我假设它是Gradle构建,而不是Jenkins本身。 它是Gradle构建,你仍然不知道哪个过程。

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

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

谢谢你的回应!我没有意识到测试是在单独的JVM上运行的,所以你的回答让我走上了正确的轨道。等待期结束后,我会奖励赏金。 – Michiyo