2012-10-31 10 views
11

Ich baue eine Maven-Java-App auf einem Jenkins-Build-Server. Ich laufe in java.lang.OutOfMemoryError: PermGen space viele Male während des Aufbaus auf Jenkins (aber nie auf meinem localhost) und folglich schlägt es mein Aufbau fehl.Legen Sie die Permgen-Größe für die Child-JVM-Prozesse fest, die Maven ausgliedern wird.

ich bereits versucht haben, MAVEN_OPTS für Jenkins Einstellung: Ich in Jenkins ging ->Manage Jenkins ->Configure system ->Global MAVEN_OPTS und es wurde -Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:PermSize=512m gesetzt. Trotz dieses hohen Wertes stoßen wir immer wieder auf Probleme mit PermGen-Speicherplatz. Ich möchte den MAVEN_OPTS nicht auf einen höheren Wert setzen; Ich kann nicht sehen, wie meine App eine Menge Speicherplatz benötigt, und ich möchte lieber auf das Problem mit dem hohen Speicherverbrauch eingehen.

In letzter Zeit dachte ich, dass das Permgen-Space-Problem NICHT von Maven selbst kommt, sondern eher von JVM-Prozessen, die Maven abspinnt (zB Plugins). Ich schlage diese Hypothese vor, weil Maven TestNG-Tests immer noch gut ausführen kann, obwohl wir bereits die Permgen-Raumfehlerlinien gespuckt haben. Ein solches Plugin, das die PermGen Fehler verursacht ist Jetty:

Oct 31, 2012 7:55:37 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: handle failed 
java.lang.OutOfMemoryError: PermGen space 

Daher würde Ich mag wissen:

Ist die MAVEN_OPTS Variable auch auf das Kind anwenden JVM verarbeitet, dass ein Maven Build spinnt aus ? Wenn nicht, wie setze ich dann die JVM-Optionen für diese untergeordneten Prozesse wie Jetty?

HINWEIS: Ich verwende Maven 3.0.4.

Antwort

7

Die meisten Maven-Plugins, die Java-Prozesse erzeugen, haben ihre eigene Art, JVM-Befehlszeilenargumente anzugeben. Zum Beispiel können Sie Heap- und Permgen-Größen in Prozessen konfigurieren, die vom Surefire-Plugin unter Verwendung des argLine-Konfigurationsparameters erzeugt werden (siehe http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#argLine).

Das Jetty-Plugin erzeugt keine Prozesse, daher werden Heap und Permgen von JVM-Argumenten bestimmt, die dem Maven-Prozess zur Verfügung gestellt werden.

Wenn Sie nicht mehr genügend Arbeitsspeicher haben, wenn Sie Jenkins ausführen, aber nicht lokal, überprüfen Sie die MAVEN_OPTS, die Jenkins an Maven übergibt.

+0

Wir haben versucht, argLine zu setzen, aber es hat nicht funktioniert, als wir 'mvn gae: run' ausgeführt haben, was das * maven-gae-plugin * ist. – ecbrodie

+1

Wenn Sie den Quellcode von 'maven-gae-plugin' betrachten, haben Sie den Parameter' jvmFlags' probiert? – Kkkev

+0

Ich stieß vor kurzem auf dasselbe Problem, also habe ich Ihren Vorschlag über die Einstellung des Parameters 'jvmFlags' ausprobiert ... und es hat wie ein Zauber funktioniert! Mein Problem war, dass wir den '' Tag in der Konfiguration für maven-gae-plugin gesetzt haben, aber wir sollten' 'immer mit '' verwenden. Vielen Dank! – ecbrodie

1

Sie können vm-Optionen global konfigurieren (Einstellungen) und sie für jeden Build-Job überschreiben. Z.B. In Maven-basierten Jobs ist das Feld MAVEN_OPTS in einem der "fortgeschrittenen" Blöcke versteckt.

1

Wie bereits in einer anderen Antwort erwähnt, hat jeder Prozess seine eigene Art, Argumente anzugeben. Im Falle eines Maven-Sub-Prozesses, der von Jenkins erzeugt wird, wird die Einstellung in der Job-Konfiguration unter dem Maven-Build sein. Sie müssen auf die Schaltfläche "Erweitert" klicken und die Option im Feld MAVEN_OPTS festlegen. zB: -XX:MaxPermSize=256m -Xms512m -Xmx1024m

Verwandte Themen