Ошибка сборки 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)

[ошибка] из памяти; чтобы увеличить объем памяти, используйте-Xmx флаг при запуске (java-Xmx128M ...)

вчера я успешно запустил компиляцию maven.

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

vagrant@dev:/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>

9 ответов


какой модуль web' ты говоришь? Это простая война и имеет упаковочный тип войны?

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

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

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


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

С Maven 3.3.1, вы могли бы использовать .mvn папка как часть соответствующего проекта и как идеальное место для такого варианта.

два новых дополнительных файлов конфигурации .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 в :

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

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


У меня такая же проблема, пытаясь скомпилировать "чистую установку", используя Lowend 512MB ram VPS и хороший процессор. Run OutOfMemory и убил сценарий повторно.

Я export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m" и работал.

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


добавить параметр

-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 ГБ ОЗУ, он должен быть по крайней мере 64-битной ОС.

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

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


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

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

использование .МВН/виртуальной машины.config worked for me plus имеет дополнительное преимущество быть связанным с проектом.


это ниже конфигурации, работающей в моем случае

<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


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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'