Как решить "превышение верхнего предела GC" с помощью maven jvmArg?

При запуске класса у меня есть следующее исключение:

Исключение в потоке "main" java.lang.OutOfMemoryError: превышен верхний предел GC

Я попытался увеличить размер кучи jvmArg изнутри maven pom.xml пакета классов:

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<parent>
    (...)
</parent>


<artifactId>(...)</artifactId>
<name>(...)</name>

<properties>
    <javaOpts.Xmx>4g</javaOpts.Xmx> <!-- default that can be adjusted on the command line with -DjavaOpts.Xmx=... -->
    <(...).basedir>${project.basedir}/..</(...).basedir>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <configuration>
                <launchers>
                    <launcher>
                        <id>MyClassName</id>
                        <mainClass>(...)</mainClass>
                        <jvmArgs>
                            <jvmArg>-Xmx${javaOpts.Xmx}</jvmArg>
                        (...) 

Я пробовал последнюю цитированную строку со многими значениями:

  • <jvmArg>-Xmx512m{javaOpts.Xmx}</jvmArg>
  • <jvmArg>-Xmx4096M{javaOpts.Xmx}</jvmArg>
  • ...
  • <jvmArg>-Xmx10000000000M{javaOpts.Xmx}</jvmArg>

Но для всех из них у меня такая же ошибка.

Кто-нибудь может мне помочь? Наблюдение: я бегу от IntelliJ IDEA.

Ответы

Ответ 1

Java 7

Это не проблема Maven, вам нужно предоставить больше памяти виртуальной машине. Вы делаете это через переменные среды, и Maven Launcher автоматически подберет эти параметры при загрузке и использует их для настройки базовой виртуальной машины Java.

Простой способ сделать это:

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled"

Окна:

set MAVEN_OPTS=-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled

(Нет двойных кавычек)

Java 8

Java 8 заменила постоянное поколение metaspace, и новые настройки выглядят следующим образом:

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M -XX:+CMSClassUnloadingEnabled"

Ответ 2

В некоторых случаях вы можете отключить ограничение GC:

-XX:-UseGCOverheadLimit

Ответ 3

Извините за очень поздний ответ, но я думаю, что мой ответ может помочь и другим людям.

scala-maven-plugin не работает с MAVEN_OPTS, единственный способ увеличить память - использовать jvmArgs в конфигурации плагина. Но вы должны поместить jvmArgs не в секцию запуска, а внутри раздела конфигурации, например:

<configuration>
    <jvmArgs>
        <jvmArg>-Xmx1024m</jvmArg>
        <jvmArg>-Xms256m</jvmArg>
    </jvmArgs>
</configuration>

Это работает для меня.

Ответ 4

Добавление параллельной сборки мусора к верхнему ответу выше, вероятно, является лучшим вариантом:

-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

Ответ 5

У меня была одна и та же проблема: мой проект wokspace состоит из> 250 модулей maven и при открытии pom.xml в IDEA теги <project> и <parent> были подчеркнуты красным цветом, и эта ошибка обнаружилась при падении над сломанные теги:

java.lang.OutOfMemoryError: превышен верхний предел GC

Мое решение:

  • установите высокие значения в >Settings >Build, Execution, Deployment >Build Tools >Maven >Importing - например, -Xmx1g и
  • измените реализацию maven в разделе >Settings >Build, Execution, Deployment >Build Tools >Maven (домашний каталог Maven) из (Bundled) Maven 3 в мою локальную установку maven (а не в комплекте с IDEA), например, в /opt/maven/apache-maven-3.3.9: Maven Settings Screenshot

Поскольку у меня были проблемы с связанным maven раньше, я просто не доверяю связанным maven.

Ответ 6

Вы добавляете jvmArgs в конфигурацию maven-scala-plugin в pom.xml.

Что вы имеете в виду, что работаете с IntelliJ IDEA? Как именно вы это делаете? Через их создание/запуск вы не собираетесь через Maven вообще! Тогда изменение пусковых установок maven-scala-plugin в вашем pom.xml в основном бесполезно. Чтобы изменить конфигурацию запуска для IntelliJ, см. Этот ответ.

Если вы действительно хотите запустить из Maven, после добавления параметров jvmArg в pom.xml, вам необходимо запустить плагин:

mvm scala:run -Dlauncher=MyClassName

Примечание: где вы помещаете MyClassName, это на самом деле имя запуска, а не класс. Для многих проектов люди выбирают разумные имена для пусковых установок, и это заставляет их часто совпадать с местным названием классов. Но вы могли бы назвать это MyLauncher, если хотите.

Чтение документов maven-scala-plugin может помочь вам.