Установите размер permgen для дочерних процессов JVM, которые Maven будет выделять.

Я создаю приложение Maven Java на сервере сборки Jenkins. Я много раз сталкивался с java.lang.OutOfMemoryError: PermGen space во время сборки на Jenkins (но никогда на моем локальном хосте), и, следовательно, моя сборка не работает.

Я уже пытался установить MAVEN_OPTS для Дженкинса: я зашел в Jenkins-->Manage Jenkins-->Configure system-->Global MAVEN_OPTS, и он был установлен на -Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:PermSize=512m. Несмотря на то, что мы установили это высокое значение, мы продолжаем сталкиваться с проблемами пространства PermGen. Я не хочу устанавливать для MAVEN_OPTS более высокое значение; Я не понимаю, как моему приложению может потребоваться гигабайт пространства, и я бы лучше углубился в проблему большого использования памяти.

В последнее время я думал, что, возможно, проблема с пространством permgen исходит НЕ от самого Maven, а скорее от одного из процессов JVM, которые Maven запускает (например, плагины). Я предлагаю эту гипотезу, потому что Maven все еще может нормально выполнять тесты TestNG, несмотря на то, что мы уже выплюнули наши строки ошибок пространства permgen. Одним из таких плагинов, вызывающих ошибку PermGen, является Jetty:.

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

Следовательно, я хотел бы знать:

Применяется ли переменная MAVEN_OPTS к дочерним процессам JVM, от которых зависит сборка Maven? Если нет, то как мне установить параметры JVM для таких дочерних процессов, как Jetty?

ПРИМЕЧАНИЕ. Я использую Maven 3.0.4.


person ecbrodie    schedule 31.10.2012    source источник


Ответы (3)


Большинство подключаемых модулей Maven, которые порождают процессы Java, будут иметь собственный способ указания аргументов командной строки JVM. Например, вы можете настроить размеры кучи и permgen в процессах, порожденных плагином Surefire, используя параметр конфигурации argLine (см. http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#argLine).

Плагин Jetty не порождает процессы, поэтому куча и permgen управляются аргументами JVM, предоставленными процессу Maven.

Если вам не хватает памяти при запуске из Jenkins, но не при локальном запуске, проверьте MAVEN_OPTS, которые Jenkins передает Maven.

person Kkkev    schedule 04.11.2012
comment
Мы попытались установить argLine, но это не сработало, когда мы запустили mvn gae:run, который является maven-gae-plugin. - person ecbrodie; 07.11.2012
comment
Глядя на исходный код maven-gae-plugin, пробовали ли вы его параметр jvmFlags? - person Kkkev; 07.11.2012
comment
Недавно я столкнулся с этой же проблемой, поэтому я попробовал ваше предложение по настройке параметра jvmFlags... и это сработало как шарм! Моя проблема заключалась в том, что мы установили тег <argLine> в конфигурации для maven-gae-plugin, но мы все время должны были использовать <jvmFlags>. Спасибо! - person ecbrodie; 10.12.2012

Вы можете настроить параметры vm глобально (настройки) и переопределить их для любого задания сборки. Например. в заданиях на основе Maven поле MAVEN_OPTS скрыто в одном из «расширенных» блоков.

person sorencito    schedule 31.10.2012

Как упоминалось ранее в другом ответе, у каждого процесса есть свой способ указания аргументов. В случае подпроцесса maven, созданного Jenkins, этот параметр будет находиться в конфигурации задания в сборке maven. Вам нужно нажать кнопку «Дополнительно» и установить опцию в поле MAVEN_OPTS. например: -XX:MaxPermSize=256m -Xms512m -Xmx1024m

person Mehul    schedule 29.11.2012