Как решить "превышение верхнего предела 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 раньше, я просто не доверяю связанным 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 может помочь вам.