Как дать Jenkins больше места для кучи, когда он работает как демон на Ubuntu?

У моих заданий Jenkins заканчивается память, давая java.lang.OutOfMemoryError сообщения в журнале сборки. Но я использовал диспетчер пакетов Ubuntu, aptitude или apt-get для установки Jenkins, и я не знаю, где искать, чтобы изменить количество кучи пространства, выделенного Jenkins.

Ответ 1

Существует два типа сообщений OutOfMemoryError, которые могут возникнуть при выполнении задания Jenkins:

  • java.lang.OutOfMemoryError: Heap space - это означает, что вы необходимо увеличить объем пространства кучи, выделенного Дженкинсу, когда начинается демон.
  • java.lang.OutOfMemoryError: PermGen space - это означает, что вам нужно увеличить объем пространства генерации, выделенный для хранения метаданных объектов Java. Увеличение значение параметра -Xmx не повлияет на эту ошибку.

В Ubuntu 12.04 LTS раскомментируйте настройку JAVA_ARGS в строке 10 /etc/default/jenkins:

  • Чтобы добавить больше кучи Java, увеличьте значение параметра -Xmx Java. Это устанавливает максимальный размер пула распределения памяти (куча мусора).
  • Чтобы добавить другое пространство PermGen, добавьте параметр XX:MaxPermSize=512m (замените 512 на что-то еще, если вы хотите больше). В куче постоянного поколения содержится метаинформация о пользовательских классах.

Например, этот экстракт находится по умолчанию /etc/default/jenkins после новой установки Jenkins:

# arguments to pass to java
#JAVA_ARGS="-Xmx256m"

Вот как это выглядело бы, если бы вы установили пустое место в 1 ГБ:

# arguments to pass to java
JAVA_ARGS="-Xmx1048m"

Не устанавливайте слишком большой размер кучи, так как все, что вы выделяете, уменьшает объем доступной памяти операционной системы и других программ, что может вызвать чрезмерный пейджинг (память обменивается между оперативной памятью и диском подкачки, что замедлит работу системы).

Если вы также установили MaxPermSpace, вам нужно добавить пробел между параметрами):

# arguments to pass to java
JAVA_ARGS="-Xmx1048m -XX:MaxPermSize=512m"

После внесения изменений перезапустите Jenkins изящно из веб-интерфейса Jenkins или принудительно немедленно перезапустите из командной строки с помощью sudo /etc/init.d/jenkins restart.

Я нашел следующий сайт полезным для понимания максимальных и постоянных размеров кучи Java: http://www.freshblurbs.com/blog/2005/05/19/explaining-java-lang-outofmemoryerror-permgen-space.html.

Ответ 2

Для CentOS каталог, по которому находится Jenkins.xml по умолчанию, это/etc/sysconfig/для jenkins-1.579-1.1

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xmx -XX:MaxPermSize="

Ответ 3

Если вы используете Ubuntu Server, сначала установите Monitoring плагин, чтобы узнать, сколько памяти использует Jenkins. Например, это я увидел после установки:

введите описание изображения здесь

Затем, с помощью команды free -m, я понял, что такое размер памяти сервера. В моем случае, 16Gb. С этой информацией я открыл /etc/default/jenkins и изменил:

JAVA_ARGS="-Djava.awt.headless=true"

к

JAVA_ARGS="-Xmx8384m -Djava.awt.headless=true"

Где 8384 - 8 ГБ. Затем я перезапустил Jenkins с помощью команды sudo service jenkins restart, а затем, после запуска задания, которое получало проблемы с памятью, все выглядело намного лучше, и работа могла завершиться на этом и последующих запусках:

введите описание изображения здесь