Ошибка Maven из памяти
На сегодняшний день мой компилятор maven не работает.
[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO] at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO] at java.lang.String.<init>(String.java:203)
[INFO] at java.lang.String.substring(String.java:1877)
[ERROR] Недостаточно памяти; для увеличения объема памяти используйте -Xmx флаг при запуске (java -Xmx128M...)
По состоянию на вчерашний день я успешно выполнил компиляцию maven.
На сегодняшний день я просто набрал свою кучу до 3 ГБ. Кроме того, я только изменил 2-3 второстепенных строки кода, поэтому я не понимаю эту ошибку "из памяти".
[email protected]:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m
EDIT: я пробовал комментарий к плакату, изменив мой неудачный модуль pom.xml. Но я получил ту же ошибку сборки maven.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<fork>true</fork>
<meminitial>1024m</meminitial>
<maxmem>2024m</maxmem>
</configuration>
</plugin>
Ответы
Ответ 1
О каком "сетевом" модуле вы говорите? Это простая война и имеет войну типа упаковки?
Если вы не используете веб-инструментарий Google (GWT), вам не нужно gwt.extraJvmArgs
Формирование процесса компиляции может быть не лучшей идеей, потому что он запускает второй процесс, который полностью игнорирует MAVEN_OPTS
, что делает анализ более трудным.
Поэтому я бы попытался увеличить Xmx, установив MAVEN_OPTS
export MAVEN_OPTS="-Xmx3000m"
И не раскладывайте компилятор в другой процесс
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Увеличение -XX:MaxPermSize=512m
не требуется, поскольку, если причиной проблемы является размер -XX:MaxPermSize=512m
, то я ожидаю ошибку java.lang.OutOfMemoryError: PermGen space
Если это не решит вашу проблему, вы можете создать дампы кучи для дальнейшего анализа, добавив -XX:+HeapDumpOnOutOfMemoryError
. Кроме того, вы можете использовать jconsole.exe в вашем каталоге java bin, чтобы подключиться к jvm во время компиляции и посмотреть, что происходит внутри кучи jvm.
Еще одна идея (может быть, глупая), которая пришла ко мне, у вас достаточно оперативной памяти внутри вашей машины? Определение объема памяти - это хорошо, но если у вашего хоста всего 4 ГБ, и тогда у вас может возникнуть проблема, что Java не может использовать определенную память, потому что она уже используется ОС, Java, MS-Office...
Ответ 2
Отвечая позже, чтобы упомянуть еще один вариант, а не общую переменную среды MAVEN_OPTS
, чтобы передать Maven для создания необходимых параметров JVM.
Поскольку Maven 3.3.1, вы можете иметь папку .mvn
как часть соответствующего проекта и a jvm.config
как идеальное место для такой опции.
два новых дополнительных файла конфигурации .mvn/jvm.config
и .mvn/maven.config
, расположенных в базовом каталоге дерева исходных текстов проекта. Если они присутствуют, эти файлы будут предоставлять параметры jvm и maven по умолчанию. Поскольку эти файлы являются частью дерева исходных текстов проекта, они будут присутствовать во всех проверках проекта и будут автоматически использоваться каждый раз, когда проект будет создан.
Как часть официальной примечания к выпуску
В Maven нетрудно определить конфигурацию JVM для каждой проектной базы. Существующий механизм, основанный на переменной окружения MAVEN_OPTS
и использовании ${user.home}/.mavenrc
, является другим вариантом с недостатком не входящего в проект.
Начиная с этой версии, вы можете определить конфигурацию JVM с помощью файла ${maven.projectBasedir}/.mvn/jvm.config
, что означает, что вы можете определить параметры для своей сборки на основе каждого проекта. Этот файл станет частью вашего проекта и будет проверен вместе с вашим проектом. Так что больше не нужны файлы MAVEN_OPTS
, .mavenrc
. Например, если вы ввели следующие параметры JVM в файл ${maven.projectBasedir}/.mvn/jvm.config
:
-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true
Основным преимуществом такого подхода является то, что конфигурация изолирована для соответствующего проекта и применяется ко всей сборке, а также менее хрупкая, чем MAVEN_OPTS
для других разработчиков, работающих в одном проекте (забывая установить его).
Кроме того, параметры будут применяться ко всем модулям в случае мультимодульного проекта.
Ответ 3
У меня возникла такая же проблема, пытаясь скомпилировать "чистую установку" с использованием VPS Lowend 512Mb и хорошего процессора. Запустите OutOfMemory и снова запустите script.
Я использовал export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"
и работал.
По-прежнему возникает некоторая компиляция, потому что в первый раз мне нужен Maven, но проблема OutOfMemory прошла.
Ответ 4
Добавить опцию
-XX:MaxPermSize=512m
в MAVEN_OPTS
maven-compiler-plugin
опции
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<fork>true</fork>
<meminitial>1024m</meminitial>
<maxmem>2024m</maxmem>
</configuration>
</plugin>
Ответ 5
Какой тип ОС вы используете?
Чтобы назначить более 2 ГБ памяти, он должен быть как минимум 64-битной ОС.
Тогда возникает и другая проблема. Даже если ваша ОС имеет неограниченную ОЗУ, но она фрагментирована таким образом, что не имеется ни одного свободного блока в 2 ГБ, вы также получите исключения из памяти. И имейте в виду, что обычная память кучи является лишь частью памяти, которую использует VM-процесс. Таким образом, на 32-битной машине вы, вероятно, никогда не сможете установить Xmx на 2048 МБ.
Я бы также предложил установить минимальную память на одно и то же значение, поскольку в этом случае, как только у VM заканчивается память, время начала 1GB выделяется с начала, тогда VM выделяет новый блок (при условии, что он увеличивается с 500 МБ блоков) на 1,5 ГБ после того, как он будет выделен, он будет копировать все материалы из одного блока в новый и освободить память после этого. Если в памяти снова закончилось выделение 2 ГБ и затем копируются 1,5 ГБ, временно выделяя 3,5 ГБ памяти.
Ответ 6
У меня возникла такая же проблема при компиляции Druid.io, наконец, сработала MaxDirectMemorySize.
export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
Ответ 7
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Ответ 8
Это ниже конфигурация работает в моем случае
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<argLine>-XX:MaxPermSize=500M</argLine>
</configuration>
</plugin>
Попробуйте использовать -XX: MaxPermSize вместо -XX: MaxPermGen
Ответ 9
При сборке проекта на платформе Unix/Linux установите синтаксис параметров Maven, как показано ниже. Обратите внимание, что одинарные знаки кавитации, а не двойные кавычки.
export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
Ответ 10
Использование .mvn/jvm.config работало для меня плюс имеет дополнительное преимущество, связанное с проектом.
Ответ 11
Это происходит в больших проектах под Windows, когда используется cygwin или другой эмулятор linux (git bash). По какому-то совпадению оба не работают над моим проектом, который является большим проектом с открытым исходным кодом. В скрипте sh вызывается пара команд mvn. Размер памяти увеличивается до размера кучи, большего, чем указано в Xmx, и большую часть времени в случае запуска второго процесса Windows. Это делает потребление памяти еще выше.
Решение в этом случае состоит в том, чтобы использовать командный файл и уменьшенный размер Xmx, и тогда операции maven будут успешными. Если есть интерес, я могу раскрыть более подробную информацию.
Ответ 12
Кто-то уже упоминал о проблеме с 32-битной ОС. В моем случае проблема заключалась в том, что я компилировал с 32-битным JDK.