Помилка збірки пам'яті 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
Не могли б ви надати більше стека? Мені цікаво дізнатись, що може спричинити за собою втрату пам'яті у ініціалізації рядка. Встановлення розміру купи у 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 знову не вдалася з вашими пропозиціями.
Kevin Meredith

1
Зазвичай я намагаюся уникати розгалуження процесу, поки я не запускаю його. Якщо у вашій системі лише 4 ГБ, тоді ОС використовує ~ 1 ГБ. Отже, у вас є 3 ГБ відпочинку. Якщо maven починається з Xms = 1 Гб, тоді решта вільної пам'яті становить 2 Гб. Далі форк компілятора розпочався з Xms = 1 ГБ ...., що зменшує вільну пам’ять до 1 ГБ. Тепер ви можете вилучити пам'ять PermGen 128 МБ, роздільний процес безпечного плагіна, ... Як ви бачите, ваш параметр 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для інших розробників, що працюють над тим самим проектом (забувши встановити його).
Більше того, варіанти застосовуватимуться до всіх модулів у разі багатомодульного проекту.


2
Зверніть увагу, що MaxPermSize ігнорується, якщо ви використовуєте JDK 8.
GeraldScott

14

У мене така ж проблема при спробі скомпілювати "чисту інсталяцію" за допомогою оперативної пам'яті VPS Lowend 512 Мб і хорошого процесора. Запустіть OutOfMemory і вбитий сценарій повторно.

Я використовував export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"і працював.

Все ще отримую якусь іншу помилку компіляції, тому що мені вперше потрібен Maven, але проблема OutOfMemory пішла.


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 = 1024м, після створення цього допису. Але у мене все-таки виникла помилка. В іншому повідомленні 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"

Цікаво, що MaxDirectMemorySize нібито не обмежений за замовчуванням (тобто ви додали ліміт, а не скоригували попередній).
Томер Габель

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



3

На якому типі ОС ви працюєте?

Для того, щоб призначити більше 2 Гб оперативної пам'яті, вона повинна мати принаймні 64-бітну ОС.

Тоді є ще одна проблема. Навіть якщо ваша ОС має необмежену оперативну пам’ять, але вона фрагментована таким чином, що не доступний жоден безкоштовний блок об’ємом 2 ГБ, ви також отримаєте винятки з пам’яті. І майте на увазі, що звичайна пам’ять купи - це лише частина пам’яті, яку використовує процес ВМ. Отже, на 32-бітній машині ви, мабуть, ніколи не зможете встановити Xmx на 2048 МБ.

Я б також запропонував встановити min min max пам’яті на те саме значення, оскільки в цьому випадку, як тільки у віртуальної машини закінчується пам’ять, перший час виділяється 1 Гб з самого початку, тоді VM виділяє новий блок (за умови, що він збільшується із збільшенням Після цього виділяється 500 Мб блоків), розміром 1,5 Гб, він копіює всі матеріали з блоку 1 на новий і звільняє пам’ять після цього. Якщо в нього знову закінчується пам’ять, виділяється 2 Гб, а потім копіюються 1,5 Гб, тимчасово виділяючи 3,5 Гб пам’яті.


1

Створюючи проект на платформі Unix / Linux, встановіть синтаксис параметрів Maven, як показано нижче. Зверніть увагу, що одиничні знаки котирування, а не подвійні котирування.

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

0

Використання .mvn / jvm.config, що працювало для мене, плюс має додаткову перевагу пов’язаності з проектом.


0

Це трапляється у великих проектах під Windows, коли використовується cygwin або інший емулятор Linux (git bash). За випадковим збігом обставини не працюють над моїм проектом, що є великим проектом з відкритим кодом. У скрипті sh викликається пара команд mvn. Об'єм пам'яті збільшується до розміру купи більше, ніж вказано в Xmx, і більшість випадків у випадку запуску другого процесу Windows. Це робить споживання пам'яті ще більшим.

Рішенням у цьому випадку є використання командного файлу та зменшеного розміру Xmx, і тоді операції maven будуть успішними. Якщо є інтерес, я можу розкрити більше деталей.


0

Хтось уже згадував про проблему з 32-розрядною ОС. У моєму випадку проблема полягала в тому, що я компілював з 32-розрядним JDK.


0

Збільшення обсягу пам'яті у змінній середовища 'MAVEN_OPTS' допоможе вирішити цю проблему. Для мене спрацювало збільшення від -Xmx756M до -Xmx1024M.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.