Решение ошибки PermGen space в сборке Maven: руководство
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для решения проблемы java.lang.OutOfMemoryError: PermGen space
необходимо увеличить размер PermGen-пространства для Maven:
export MAVEN_OPTS="-XX:MaxPermSize=256m"
Эта команда выделит PermGen-пространству размер в 256 мегабайт, которого будет достаточно для хранения метаданных классов в процессе сборки.
Эффективное выделение памяти
По умолчанию JVM выделяет начальный и максимальный размер кучи, которые определяются параметрами (-Xms) и (-Xmx) соответственно. Установите оптимальное использование памяти для вашего проекта, скорректировав следующие параметры JVM:
export MAVEN_OPTS="-Xms512m -Xmx2048m -XX:MaxPermSize=512m"
# Теперь наша JVM действительно готова к серьезной работе!
Настройка памяти для плагинов
Чтобы задать ограничения по памяти для плагинов maven-compiler и maven-surefire, используйте следующие настройки в файле pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork>
<meminitial>256m</meminitial>
<maxmem>512m</maxmem>
<!-- Больше памяти — меньше проблем! -->
</configuration>
</plugin>
А также оптимизируйте использование памяти для плагина maven-surefire-plugin, чтобы тесты выполнялись с необходимыми ресурсами:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>1C</forkCount>
<argLine>-XX:MaxPermSize=256m</argLine>
<!-- Больше памяти для тестов — больше уверенности в итоговых результатах! -->
</configuration>
</plugin>
Визуализация
Представим PermGen-пространство как стоянку, на которой каждый класс или метаданные занимают место. Пример ниже показывает, как заполняются всё больше и больше "парковочных мест" в разное время:
Перед началом сборки Maven: |🚗🚗🚗🚗| <- Множество свободных мест
При запуске сборки проекта "парковка" начинает заполняться "автомобилями":
Во время сборки Maven: |🚗🚗🚗🚗🚗🚗🚗🚗🚗| <- Свободных мест все меньше. 🚨 **OutOfMemoryError**
Предотвратим ошибки, расширив "парковку":
# Добавляем места с помощью MAVEN_OPTS
MAVEN_OPTS="-XX:MaxPermSize=256m" mvn install
Вот как выглядит достаточно просторная "парковка":
После увеличения PermGen: |🚗🚗🚗🚗🚗🚗| <- Достаточно места для всех. Сборка успешна!
Maven и PermGen
Процесс загрузки классов, особенно при использовании Maven, может приводить к ошибке OutOfMemoryError: PermGen space
. Понимание этого механизма позволит вам более точно управлять объёмом PermGen-пространства, выделенным под ваши зависимости и плагины.
Настройка MAVEN_OPTS в Windows
В операционной системе Windows желательно задать переменную окружения MAVEN_OPTS
таким образом:
set MAVEN_OPTS=-XX:MaxPermSize=256m
# Пользователей системы Windows тоже ждёт просторная "парковка".
После установки не забудьте перезапустить командную строку, чтобы новые значение переменных окружения были применены при следующем запуске сборки Maven.
Советы от сообщества разработчиков
Важно не пренебрегать возможностью обучаться на опыте обсуждений, которые регулярно ведутся в сообществе разработчиков. Площадки типа StackOverflow предлагают множество полезных советов и актуальных рекомендаций. Отталкиваясь от того, как кофе заряжает разработчиков энергией, обновления плагинов Maven тем же образом повышают производительность процесса сборки и дают возможность использовать новые версии.
Полезные материалы
- Maven – Конфигурация Apache Maven — официальная страница configurации Maven.
- Устранение ошибки "java.lang.OutOfMemoryError: PermGen space" – Stack Overflow — советы и опыт сообщества в решении проблемы с PermGen space.
- Введение в работу со сборщиком мусора G1 — обучающий материал от Oracle про сборщик мусора G1.
- VisualVM: Скачать — инструмент для отладки и анализа выполнения Java-приложений.
- Ошибки OutOfMemoryError в Apache Maven — информация об ошибке OutOfMemoryError от Apache.
- Управление памятью в Java — детальный обзор управления памятью в Java от Baeldung.