2016-05-06 7 views
0

Ich habe eine Jenkins-Build eines Android-Projekts auf einem Mac Mini (10.9.5). Die Jenkins Build schlägt fehl mit Fehlermeldungen wie folgt aus:Erhöhung von PermGen Speicherplatz für Jenkins/Gradle

<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 

Dies wird manchmal gefolgt von Nachrichten wie

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 

Es scheitert in der Regel an der gleichen Stelle in der Build. Entsprechend der Jenkins wiki

Sehen Sie ständig OOME rund um die gleiche Phase in einem Build? Wenn ja, braucht es vielleicht nur einen größeren Speicher.

dies kann bedeuten, ich brauche nur mehr PermGen Raum.

Die Stackoverflow-Beiträge/Blogposts, die ich gelesen habe, zeigen an, dass ich die maximale PermGen-Größe (-XX:MaxPermSize=1024M, zum Beispiel) erhöhen muss. Ich weiß jedoch nicht, wo ich das machen soll.

Ich habe dies änderte sich für GRADLE_OPTS und JAVA_OPTS so Umgebung meine Jenkins bauen wie folgt aussieht: environmental variables

Wie im Screenshot zu sehen, ich einige Optionen Müll sammeln Perm Gen auch hinzugefügt, wie here empfohlen.

Das schien zu funktionieren - ich hatte gestern ein paar erfolgreiche Builds, aber es scheitert jetzt wieder (ohne Änderungen, die mir bekannt sind).

Nach dem Lesen this answer, änderte ich auch die folgende Zeile in meinem Projekt gradle.properties Datei.

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

Dies hat das Problem nicht behoben.

Antworten auf ähnliche Fragen wie this und this lassen mich denken, dass ich mich dem falsch nähern könnte - sollte ich eine Computereinstellung für den Mac (10.9.5) ändern, auf dem Jenkins läuft? Wie ändere ich den PermGen-Bereich richtig?

Edit: Ich dachte vorher hatte, dass vielleicht die Umgebungsvariablen wurden nicht festgelegt zu werden, aber ich festgestellt, dass sie unter dem Build-Ergebnis Umgebungsvariablen erscheinen (jenkins/job/<Project>/146/injectedEnvVars/)

java_opts gradle_opts

Antwort

1

Wie Integration Stuff sagte, war es notwendig, die MaxPermSize für die Unit-Tests zu erhöhen. Ich habe gefunden, wie man das tut here in der "Running from Gradle" -Abschnitt.

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

Die Einstellungen Speicher werden pro laufendem JVM-Prozess festgelegt. Sie müssen also definitiv keine Betriebssystemvariablen oder systemweite Einstellungen vornehmen, um dies zu beheben.

Zuerst müssen Sie ermitteln, welcher Prozess den Fehler verursacht. Ich gehe davon aus, dass es der Gradle Build ist und nicht die Jenkins selbst. Es ist der Gradle-Build, Sie wissen immer noch nicht, welcher Prozess.

Standardmäßig führt der Task "Gradle Test" die Tests in einem separaten JVM aus. Daher hilft Ihnen das Ändern der Werte in "gradle.properties" in einem solchen Fall nicht. In einem solchen Fall müssen Sie Ihre Gradle Prüfaufgabe richtig zum Beispiel konfigurieren:

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

Vielen Dank für Ihre Antwort! Ich hatte nicht bemerkt, dass die Tests auf einer separaten JVM laufen, also hat mich deine Antwort auf den richtigen Weg gebracht. Ich werde das Kopfgeld vergeben, wenn die Wartezeit abgelaufen ist. – Michiyo