У моих заданий Jenkins заканчивается память, давая java.lang.OutOfMemoryError
сообщения в журнале сборки. Но я использовал диспетчер пакетов Ubuntu, aptitude
или apt-get
для установки Jenkins, и я не знаю, где искать, чтобы изменить количество кучи пространства, выделенного Jenkins.
Как дать Jenkins больше места для кучи, когда он работает как демон на Ubuntu?
Ответ 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
, а затем, после запуска задания, которое получало проблемы с памятью, все выглядело намного лучше, и работа могла завершиться на этом и последующих запусках: