如何使用maven jvmArg解决“超出GC开销限制”?

运行类时,我有以下exception:

线程“main”中的exceptionjava.lang.OutOfMemoryError:超出了GC开销限制

我试图从类包的maven pom.xml中增加jvmArg堆大小:

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

 (...)  (...) (...)  4g  ${project.basedir}/..     net.alchim31.maven scala-maven-plugin    MyClassName (...)  -Xmx${javaOpts.Xmx} (...) 

我尝试了最后引用的行,其中包含许多值:

  • -Xmx512m{javaOpts.Xmx}
  • -Xmx4096M{javaOpts.Xmx}
  • -Xmx10000000000M{javaOpts.Xmx}

但对于他们所有人我都有同样的错误。

有人可以帮帮我吗? 观察:我是从IntelliJ IDEA运行的。

Java 7

这不是Maven问题,您需要为VM提供更多内存。 您可以通过环境变量执行此操作,Maven Launcher将在加载时自动获取这些设置,并使用它们来配置底层Java VM。

这样做的简单方法是:

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

视窗:

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

(没有双引号)

Java 8

Java 8用元空间替换了永久代,新设置如下所示:

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

将并行垃圾收集添加到上面的答案可能是最好的选择:

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

我遇到了同样的问题:我的项目wokspace由> 250个maven模块组成,当在IDEA中打开一个pom.xml时, 标签以红色下划线显示,当鼠标hover在破碎的标签:

java.lang.OutOfMemoryError:超出了GC开销限制

我的解决方案

  • >Settings >Build, Execution, Deployment >Build Tools >Maven >Importing设置高值 – 例如-Xmx1g
  • >Settings >Build, Execution, Deployment >Build Tools >Maven (Maven主目录)下的maven实现从(Bundled) Maven 3更改为我的本地maven安装(不是与IDEA捆绑的安装),例如更改为/opt/maven/apache-maven-3.3.9Maven设置截图

由于之前我遇到了捆绑maven的问题,我只是不相信捆绑的maven。

在某些情况下,您可以禁用GC限制:

 -XX:-UseGCOverheadLimit 

很抱歉很晚才回复,但我认为我的回答也可以帮助其他人。

scala-maven-plugin不能与MAVEN_OPTS一起使用,增加内存的唯一方法是在插件配置中使用jvmArgs。 但你应该把jvmArgs放在启动器部分,但在配置部分,如下所示:

   -Xmx1024m -Xms256m   

这对我有用。

您正在将jvmArgs添加到pom.xml中的maven-scala-plugin配置中。

你是什​​么意思从IntelliJ IDEA运行? 你究竟是怎么做到的? 通过他们的构建/运行,你根本不会通过Maven! 然后更改pom.xml中的maven-scala-plugin启动器基本上没用。 要更改IntelliJ的运行配置,请参阅此答案 。

如果你真的想从Maven运行,在将jvmArg参数添加到pom.xml后,则需要运行该插件:

 mvm scala:run -Dlauncher=MyClassName 

注意:放置MyClassName的位置,实际上是启动器的名称,而不是类。 对于许多项目,人们为发射器选择合理的名称,这使得它们通常与类的本地名称一致。 但如果你愿意,你可以称之为MyLauncher。

阅读maven-scala-plugin的文档可能会对你有所帮助。