首页 文章

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

提问于
浏览
22

运行类时,我有以下异常:

线程“main”中的异常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>-Xmx512m{javaOpts.Xmx}</jvmArg>

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

  • ......

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

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

有人可以帮帮我吗?观察:我是从 IntelliJ IDEA 开始的 .

6 回答

  • 0

    Java 7

    这不是Maven问题,您需要为VM提供更多内存 . 您可以通过 environment variables 执行此操作,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"

  • 36

    我遇到了同样的问题:我的项目wokspace由> 250个maven模块组成,当在IDEA中打开 pom.xml 时, <project><parent> 标签用红色加下划线,当悬停在损坏的标签上时出现此错误:

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

    My solution

    • >Settings >Build, Execution, Deployment >Build Tools >Maven >Importing 中设置了较高的值 - 例如 -Xmx1g and

    • >Settings >Build, Execution, Deployment >Build Tools >Maven (Maven主目录)下的maven实现从 (Bundled) Maven 3 更改为我的本地maven安装(不是与IDEA捆绑的安装),例如至 /opt/maven/apache-maven-3.3.9
      Maven Settings Screenshot

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

  • 4

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

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

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

    -XX:-UseGCOverheadLimit
    
  • 3

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

    scala-maven-plugin不能与MAVEN_OPTS一起使用,增加内存的唯一方法是在插件配置中使用jvmArgs . 但是你应该把jvmArgs放在启动器部分里面,但是在配置部分里面,就像这样:

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

    这适合我 .

  • 2

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

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

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

    mvm scala:run -Dlauncher=MyClassName
    

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

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

相关问题