Ошибка сборки Maven из-за нехватки памяти

88

На сегодняшний день моя компиляция 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)

[ОШИБКА] Недостаточно памяти; для увеличения объема памяти используйте флаг -Xmx при запуске (java -Xmx128M ...)

По состоянию на вчерашний день я успешно выполнил компиляцию maven.

На сегодняшний день я просто увеличил свою кучу до 3 ГБ . Кроме того, я изменил только 2-3 второстепенных строки кода, поэтому я не понимаю эту ошибку «нехватки памяти».

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m

РЕДАКТИРОВАТЬ: Я попробовал комментарий постера, изменив 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
Не могли бы вы предоставить больше трассировки стека? Мне любопытно узнать, что может вызвать нехватку памяти при инициализации String. Установка размера кучи в MAVEN_OPTS звучит неплохо, но я предполагаю, что где-то есть смехотворно большая строка, для которой вы, возможно, просто не выделяете достаточно -Xmx.
Эдвард Самсон,

Ответы:

136

О каком «веб-модуле» вы говорите? Это простая война и война упаковочного типа?

Если вы не используете веб-инструментарий 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не требуется, потому что, если размер завивки является причиной проблемы, я бы ожидал ошибкиjava.lang.OutOfMemoryError: PermGen space

Если это не решит вашу проблему, вы можете создать дампы кучи для дальнейшего анализа, добавив -XX:+HeapDumpOnOutOfMemoryError. Кроме того, вы можете использовать jconsole.exe в каталоге java bin, чтобы подключиться к jvm во время компиляции и посмотреть, что происходит внутри кучи jvm.

Еще одна идея (может быть, глупая), которая пришла мне в голову, достаточно ли у вас оперативной памяти внутри вашей машины? Определение размера памяти - это хорошо, но если ваш хост имеет только 4 ГБ, и тогда у вас может быть проблема, что Java не может использовать определенную память, потому что она уже используется ОС, Java, MS-Office ...

ВАЧ
источник
Спасибо за ваш ответ. Ваше предложение об удалении разветвленной JVM также относится к плагину maven-surefire? Я попробовал ваше предложение увеличить объем моей памяти MAVEN_OPTS до 3000. В моем компиляторе maven не было настроек для разветвленной JVM, поэтому мне не нужно было ничего менять там. И да, моя гостевая виртуальная машина имеет 4 ГБ ОЗУ. Хост-машина имеет 8 ГБ ОЗУ.
Кевин Мередит,
2
кстати, сборка mvn снова не удалась с вашими предложениями.
Кевин Мередит,
1
Обычно я стараюсь избегать разветвления процесса, пока он не запущен. Если в вашей системе всего 4 ГБ, то ОС использует ~ 1 ГБ. Итак, у вас остаётся 3Гб. Если maven начинается с Xms = 1 ГБ, оставшаяся свободная память составляет 2 ГБ. Затем вилка компилятора началась с Xms = 1GB .... что уменьшает свободную память до 1GB. Теперь вы можете вычесть PermGen Memory 128MB, разветвленный процесс отказоустойчивого плагина ... Как видите, ваши настройки Xmx, скорее всего, никогда не могут быть использованы в JVM, поскольку память просто не свободна. Вы пробовали использовать JConsole? и HeapDumpOnOutOfMemoryError?
vach
Я удалил Xms1024m из своего MAVEN_OPTS, но сборка mvn все равно не удалась. Я добавил "HeapDump ..." в свой MAVEN_OPTS, но я не уверен, где будет напечатан дамп. Сейчас заглядываю в JConsole.
Кевин Мередит,
Дампы находятся в каталоге
jvms
36

Отвечая поздно, чтобы упомянуть еще один вариант, а не общую MAVEN_OPTSпеременную среды, чтобы передать сборке Maven необходимые параметры JVM.

Начиная с Maven 3.3.1 , у вас может быть .mvnпапка как часть соответствующего проекта и 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файлов. Так, например, если вы поместите в ${maven.projectBasedir}/.mvn/jvm.configфайл следующие параметры JVM :

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

Основным преимуществом этого подхода является то, что конфигурация изолирована от соответствующего проекта и применяется ко всей сборке, и менее хрупкая, чем MAVEN_OPTSдля других разработчиков, работающих над тем же проектом (забывая настроить ее).
Более того, в случае многомодульного проекта опции будут применены ко всем модулям.

A_Di-Matteo
источник
2
Обратите внимание, что MaxPermSize игнорируется, если вы используете JDK 8.
GeraldScott,
14

У меня такая же проблема при попытке скомпилировать "чистую установку" с использованием Lowend 512 МБ RAM VPS и хорошего процессора. Повторно запустите OutOfMemory и убейте скрипт.

Использовал export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"и работал.

По-прежнему возникает другая ошибка компиляции, потому что мне впервые нужен Maven, но проблема OutOfMemory исчезла.

m3nda
источник
11

Добавить вариант

-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>
Илья
источник
2
Я действительно добавил параметр -XX: MaxPermSize = 1024m после того, как сделал этот пост. Но у меня все еще возникает ошибка нехватки памяти. В другом сообщении SO упоминалось, что мне нужно добавить параметр в argLine maven-surefire-plugin, чтобы увеличить объем памяти, используемый разветвленными потоками. Я увеличил его до <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Кевин Мередит
Я должен был упомянуть, что ... Нет, сборка maven все еще не удалась.
Кевин Мередит
Добавить все эти свойства maven-compilier-pluginи увеличить -XX:MaxPermSize, Xmxдолжно быть =XX:MaxPermSize
Илья
Также используйте опцию <fork> true </true> вmaven-compilier-plugin
Илья
Я пробовал это (см. Исходный пост), но моя сборка mvn все равно не удалась.
Кевин Мередит,
4

У меня такая же проблема при компиляции Druid.io, увеличение MaxDirectMemorySize наконец-то сработало.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
hahakubile
источник
Любопытно, что MaxDirectMemorySize по умолчанию якобы неограничен (то есть вы добавили ограничение, а не изменили существующее).
Tomer Gabel
4

Эта конфигурация ниже работает в моем случае

<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

Нараян Еррабачу
источник
4
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Диспетчер устройств
источник
3

На какой ОС вы работаете?

Чтобы назначить более 2 ГБ оперативной памяти, это должна быть как минимум 64-битная ОС.

Тогда возникает еще одна проблема. Даже если ваша ОС имеет неограниченную оперативную память, но она фрагментирована таким образом, что не доступен ни один свободный блок размером 2 ГБ, вы также получите исключения из памяти. И имейте в виду, что обычная память Heap - это только часть памяти, которую использует процесс виртуальной машины. Таким образом, на 32-битной машине вы, вероятно, никогда не сможете установить Xmx на 2048 МБ.

Я также предлагаю установить min max memory на то же значение, потому что в этом случае, как только у виртуальной машины заканчивается память, с самого начала выделяется 1 ГБ, затем виртуальная машина выделяет новый блок (при условии, что он увеличивается с Блоки 500 МБ) из 1,5 ГБ после этого будет скопирован весь материал из блока 1 в новый и освободит память после этого. Если ему снова не хватает памяти, выделяются 2 ГБ, а затем копируются 1,5 ГБ, временно выделяя 3,5 ГБ памяти.

Кристофер Дутц
источник
1

При сборке проекта на платформе Unix / Linux установите синтаксис параметров Maven, как показано ниже. Обратите внимание на знаки одиночной qoutation, а не двойной qoutation.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
ÖMER TAŞCI
источник
0

Использование .mvn / jvm.config у меня сработало, плюс есть дополнительное преимущество, связанное с проектом.

Colinbes
источник
0

Это происходит в больших проектах в Windows, когда используется cygwin или другой эмулятор Linux (git bash). По некоторому совпадению, оба они не работают над моим проектом, а это большой проект с открытым исходным кодом. В сценарии sh вызывается пара команд mvn. Размер памяти увеличивается до размера кучи, большего, чем указано в Xmx, и большую часть времени в случае запуска второго процесса Windows. Это делает потребление памяти еще выше.

Решение в этом случае - использовать командный файл и уменьшить размер Xmx, и тогда операции maven будут успешными. Если есть интерес, могу подробнее рассказать.

жрист
источник
0

Кто-то уже упоминал о проблеме с 32-битной ОС. В моем случае проблема заключалась в том, что я компилировал 32-битный JDK.

user2046211
источник
0

Увеличение размера памяти в переменной среды «MAVEN_OPTS» поможет решить эту проблему. Для меня сработало увеличение с -Xmx756M до -Xmx1024M.

Нидхи
источник