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

Posted

技术标签:

【中文标题】如何使用 maven jvmArg 解决“超出 GC 开销限制”?【英文标题】:How to solve "GC overhead limit exceeded" using maven jvmArg? 【发布时间】:2013-09-17 04:58:12 【问题描述】:

运行课程时出现以下异常:

线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制

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

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>
                        (...) 

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

&lt;jvmArg&gt;-Xmx512mjavaOpts.Xmx&lt;/jvmArg&gt; &lt;jvmArg&gt;-Xmx4096MjavaOpts.Xmx&lt;/jvmArg&gt; ... &lt;jvmArg&gt;-Xmx10000000000MjavaOpts.Xmx&lt;/jvmArg&gt;

但是对于所有这些我都有同样的错误。

有人可以帮助我吗? 观察:我正在运行 IntelliJ IDEA

【问题讨论】:

Maven 与“运行”无关。如果您的问题是在运行应用程序时内存不足,您需要在启动时设置堆大小参数,而不是在构建时在 maven 中设置。如果我误解了,请更新您的问题 我假设这是一个类型:&lt;jvmArg&gt;-Xmx512mjavaOpts.Xmx&lt;/jvmArg&gt;,而你的意思实际上是&lt;jvmArg&gt;-Xmx512m&lt;/jvmArg&gt; 【参考方案1】:

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"

【讨论】:

这应该被添加到你的 shell 环境中,而不是你的 pom.xml。 将“set MAVEN_OPTS=-Xms1024M -Xmx2048M -XX:-UseGCOverheadLimit”行作为第一行代码添加到“mvn.bat”文件中。 “mvn.bat”可以在 C:\MAVEN_INSTALLATION_DIRECTORY\bin 找到。如果你在 Unix 平台上,你应该编辑 mvn.sh 而不是 mvn.bat。您可以根据程序运行/编译/构建所需的内存量来更改 -Xms 和 -Xmx 值。 仅供参考:Java 8 中删除了 MaxPermSize 选项,现在被忽略了。 @flavian 您的回答有误。我认为您的意思是 - 启动内存分配 - Xms128m 而不是 -Xss128m - 这是每个线程的 huuuuge 堆栈大小 就我而言,这是一个 Maven 问题。正常在 3 分钟内完成,但在 30 分钟后失败。【参考方案2】:

我遇到了同样的问题:我的项目 wokspace 包含 >250 个 maven 模块,当在 IDEA 中打开 pom.xml 时,&lt;project&gt;&lt;parent&gt; 标记带有红色下划线,并且出现了这个错误,当将鼠标悬停在损坏的标签上:

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

我的解决方案

&gt;Settings &gt;Build, Execution, Deployment &gt;Build Tools &gt;Maven &gt;Importing 中设置高值 - 例如-Xmx1g &gt;Settings &gt;Build, Execution, Deployment &gt;Build Tools &gt;Maven(Maven 主目录)下的maven 实现从(Bundled) Maven 3 更改为我的本地maven 安装(不是与IDEA 捆绑的那个),例如到/opt/maven/apache-maven-3.3.9

由于我之前在使用 bundled maven 时遇到过问题,所以我只是不信任 bundled maven。

【讨论】:

在 Maven 上添加堆大小选项:导入屏幕(但保留捆绑的 Maven 3)在尝试在 IntelliJ 中导入整个 wildfly-swarm 项目时对我有用。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

-XX:-UseGCOverheadLimit

【讨论】:

就我而言只是为了得到java.lang.OutOfMemoryError: Java heap space :-/ 禁用它只会延迟问题,而不是缓解它。【参考方案5】:

抱歉,回复太晚了,但我认为我的回答也可能对其他人有所帮助。

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

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

这对我有用。

【讨论】:

【参考方案6】:

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

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

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

mvm scala:run -Dlauncher=MyClassName

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

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

【讨论】:

对 pom 进行更改后,我从终端调用 mvn clean 和 mvn install。但使用 IDEA 运行按钮。其实我想用IDEA的Debug来观察一些变量,发现软件的输出错误是从哪里来的。这在终端上是不可能的(据我所知)。 从终端使用上面所说的 mvn 命令也会产生错误。 您是否尝试从终端设置export MAVEN_OPTS=-Xmx2G【参考方案7】:

以上答案都不适合我。起作用的是来自 Intellij 支持论坛的 this answer。它建议通过构建、执行、部署 > 编译器 > 构建过程堆大小(Mbytes)将构建过程堆大小增加到 1024 MB /p>

【讨论】:

以上是关于如何使用 maven jvmArg 解决“超出 GC 开销限制”?的主要内容,如果未能解决你的问题,请参考以下文章

mavan下scala编译中文乱码的问题.以及内存溢出问题解决

Maven之配置jetty

Ant、jvmarg、系统属性和引号

jvmargs=-xmx2048m dex 正在处理cordova

如何配置maven pom文件来解决jar包冲突

使用maven版本时如何解决权限被拒绝(公钥)