it-roy-ru.com

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 второстепенные строки кода, поэтому я не понимаю эту ошибку «недостаточно памяти».

[email protected]:/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>
72
Kevin Meredith

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

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

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

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

111
vach

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

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

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

25
A_Di-Matteo

У меня возникла та же проблема, когда я пытался скомпилировать «чистую установку», используя VPS Lowend 512Mb и хороший процессор. Запустите OutOfMemory и убитый скрипт повторно.

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

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

12
erm3nda

Добавить опцию 

-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>
10
Ilya

На каком типе ОС вы работаете? 

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

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

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

3
Christofer Dutz

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

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
2
hahakubile
_Java_OPTIONS="-Xmx3G" mvn clean install
1
DeviceManager

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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
0
ÖMER TAŞCI

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

0
colinbes

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

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

0
zhrist

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

<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

0
Narayan Yerrabachu