Ошибка 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.