如何使用 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>
(...)
我已经尝试了最后引用的行,其中包含许多值:
<jvmArg>-Xmx512mjavaOpts.Xmx</jvmArg>
<jvmArg>-Xmx4096MjavaOpts.Xmx</jvmArg>
...
<jvmArg>-Xmx10000000000MjavaOpts.Xmx</jvmArg>
但是对于所有这些我都有同样的错误。
有人可以帮助我吗? 观察:我正在运行 IntelliJ IDEA。
【问题讨论】:
Maven 与“运行”无关。如果您的问题是在运行应用程序时内存不足,您需要在启动时设置堆大小参数,而不是在构建时在 maven 中设置。如果我误解了,请更新您的问题 我假设这是一个类型:<jvmArg>-Xmx512mjavaOpts.Xmx</jvmArg>
,而你的意思实际上是<jvmArg>-Xmx512m</jvmArg>
?
【参考方案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
时,<project>
和 <parent>
标记带有红色下划线,并且出现了这个错误,当将鼠标悬停在损坏的标签上:
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.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编译中文乱码的问题.以及内存溢出问题解决