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

редактировать: я пробовал комментарий плаката, изменив 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 66

9 ответов:

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

если вы не используете веб-инструментарий 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 не должно требоваться, потому что если Пермь 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 в ${maven.projectBasedir}/.mvn/jvm.config file:

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

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

У меня такая же проблема пытаюсь скомпилировать "чистой установки" с использованием бюджетного 512 МБ оперативной памяти VPS и хороший процессор. Запустите 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 не доступен, вы также получите исключения из памяти. И имейте в виду, что обычная память кучи-это только часть памяти, которую использует процесс виртуальной машины. Так что на 32-битной машине вы, вероятно, никогда не сможете чтобы установить Xmx в 2048 Мб.

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

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

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

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

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

<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'