2012-10-31 16 views
11

Buduję aplikację Java Maven na serwerze kompilacji Jenkins. W trakcie kompilacji na Jenkinsach (ale nigdy na moim lokalnym hoście lokalnym) wielokrotnie występuję pod java.lang.OutOfMemoryError: PermGen space, a więc nie udaje mi się skompilować.Ustaw rozmiar permgenu dla procesów potomnych JVM, które Maven wyłączy się

Próbowałem już ustawienie MAVEN_OPTS dla Jenkins: Poszedłem do Jenkins ->Manage Jenkins ->Configure system ->Global MAVEN_OPTS i został ustawiony na -Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:PermSize=512m. Pomimo ustawienia tej wysokiej wartości, ciągle wpadamy na problemy z przestrzeniami PermGen. Nie chcę ustawić MAVEN_OPTS na wyższą wartość; Nie widzę, jak moja aplikacja może wymagać dużej przestrzeni i wolę zagłębić się w problem z dużą ilością pamięci.

Ostatnio, myślałem, że być może problem przestrzeni permen NIE pochodzi z samego Mavena, ale raczej z jednego z procesów JVM, które Maven odpina (np. Wtyczki). Proponuję tę hipotezę, ponieważ Maven wciąż jest w stanie wykonać testy TestNG w porządku, mimo że już wypluwają nasze linie błędów permen space. Jeden taki plugin, który jest przyczyną błędu PermGen jest Jetty:

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

Dlatego chciałbym wiedzieć:

Czy zmienna MAVEN_OPTS stosuje się także do dziecka JVM przetwarza że build Maven obraca się ? Jeśli nie, to w jaki sposób ustawić opcje maszyny JVM dla procesów podrzędnych, takich jak Jetty?

UWAGA: Używam Maven 3.0.4.

Odpowiedz

7

Większość wtyczek Mavena, które odradzają procesy Java, będzie miała własny sposób określania argumentów wiersza poleceń maszyny JVM. Na przykład można skonfigurować rozmiary sterty i permgenu w procesach spawnowanych przez wtyczkę Surefire przy użyciu parametru konfiguracyjnego argLine (patrz http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#argLine).

Wtyczka Jetty nie spawnuje procesów, więc sterty i permgen są zarządzane przez argumenty JVM dostarczone do procesu Mavena.

Jeśli brakuje wolnej pamięci podczas uruchamiania z Jenkins, ale nie podczas pracy lokalnie, sprawdź MAVEN_OPTS, że Jenkins przechodzi do Maven.

+0

Próbowaliśmy ustawić argLine, ale nie działało, gdy uruchomiliśmy 'mvn gae: run', która jest * maven-gae-plugin *. – ecbrodie

+1

Patrząc na kod źródłowy 'maven-gae-plugin', wypróbowałeś jego parametr' jvmFlags'? – Kkkev

+0

Wpadłem ostatnio na ten sam problem, więc wypróbowałem twoją sugestię o ustawieniu parametru 'jvmFlags' ... i działało jak czar! Mój problem polegał na tym, że ustawiliśmy znacznik '' w konfiguracji dla wtyczki maven-gae, ale powinniśmy używać '' przez cały czas. Dziękuję Ci! – ecbrodie

1

Możesz konfigurować opcje vm globalnie (ustawienia) i nadpisać je dla dowolnego zadania kompilacji. Na przykład. w zadaniach opartych na Maven pole MAVEN_OPTS jest ukryte w jednym z "zaawansowanych" bloków.

1

Jak wspomniano wcześniej w innej odpowiedzi, że każdy proces ma własny sposób określania argumentów. W przypadku podprocesowania maven przez Jenkinsa ustawienie będzie miało konfigurację zadania pod maven build. Należy kliknąć przycisk "Zaawansowane" i ustawić opcję w polu MAVEN_OPTS. np .: -XX:MaxPermSize=256m -Xms512m -Xmx1024m