Maven Out of Memory构建失败

时间:2012-09-19 16:13:18

标签: maven out-of-memory maven-3 pom.xml maven-compiler-plugin

截至今天,我的maven编译失败了。

[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO]  at java.lang.String.<init>(String.java:203)
[INFO]  at java.lang.String.substring(String.java:1877)
  

[错误]内存不足;要增加内存量,请使用-Xmx   启动时标志(java -Xmx128M ...)

截至昨天,我已经成功运行了maven编译。

截至今天,我刚刚将我的堆增加到 3 GB 。此外,我只更改了2-3行代码,因此我不理解这种“内存不足”错误。

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m
编辑:我通过更改失败的模块的pom.xml来尝试海报的评论。但是我得到了相同的maven构建错误。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
            <fork>true</fork>
            <meminitial>1024m</meminitial>
            <maxmem>2024m</maxmem>
       </configuration>
    </plugin>

14 个答案:

答案 0 :(得分:113)

你在谈论什么样的'网络'模块? 这是一场简单的战争还有包装类型的战争?

如果您没有使用Google的网络工具包(GWT),那么您无需提供任何gwt.extraJvmArgs

分配编译过程可能不是最好的主意,因为它启动了第二个完全忽略MAVEN_OPTS的过程,从而使分析更加困难。

所以我会尝试通过设置MAVEN_OPTS来增加Xmx

export MAVEN_OPTS="-Xmx3000m"

不要将编译器分叉到其他进程

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>

不应该增加-XX:MaxPermSize=512m,因为如果perm大小是问题的原因,那么我预计错误java.lang.OutOfMemoryError: PermGen space

如果这不能解决您的问题,那么您可以通过添加-XX:+HeapDumpOnOutOfMemoryError来创建堆转储以进行进一步分析。此外,您可以在java bin目录中使用jconsole.exe在编译运行时连接到jvm,并查看jvm堆内的内容。

另一个想法(可能是一个愚蠢的想法)出现在我面前,你的机器里面有足够的内存吗?定义内存大小很好,但是如果你的主机只有4GB,那么你可能会遇到Java无法使用已定义内存的问题,因为它已经被操作系统,Java,MS-Office使用......

答案 1 :(得分:27)

回答提及另一个选项而不是传递给Maven的公共MAVEN_OPTS环境变量构建所需的JVM选项。

自Maven 3.3.1以来,您可以将.mvn文件夹作为相关项目的一部分,将jvm.config文件作为此类选项的理想位置。

  

两个新的可选配置文件.mvn/jvm.config.mvn/maven.config,位于项目源树的基本目录中。如果存在,这些文件将提供默认的jvm和maven选项。由于这些文件是项目源代码树的一部分,因此它们将出现在所有项目签出中,并且每次构建项目时都会自动使用。

作为官方release notes

的一部分
  

在Maven中,在每个项目基础上定义JVM配置并不简单。基于环境变量MAVEN_OPTS的现有机制和${user.home}/.mavenrc的使用是另一种选择,缺点是不属于项目的一部分。

     

从此版本开始,您可以通过${maven.projectBasedir}/.mvn/jvm.config文件定义JVM配置,这意味着您可以在每个项目基础上定义构建的选项。此文件将成为项目的一部分,并将与您的项目一起签入。因此MAVEN_OPTS.mavenrc文件不再需要了。例如,如果将以下JVM选项放入${maven.projectBasedir}/.mvn/jvm.config文件中:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

这种方法的主要优点是配置与相关项目隔离并应用于整个构建,并且对于在同一项目中工作的其他开发人员而言比MAVEN_OPTS更不易碎(忘记设置它) )。
此外,如果是多模块项目,这些选项将应用于所有模块。

答案 2 :(得分:12)

我尝试使用Lowend 512Mb ram VPS和良好的CPU编译“干净安装”时遇到同样的问题。运行OutOfMemory并重复杀死脚本。

我使用了export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"并且工作了。

还有其他一些编译失败,因为这是我第一次需要Maven,但OutOfMemory问题已经消失。

答案 3 :(得分:10)

添加选项

-XX:MaxPermSize=512m

到MAVEN_OPTS

maven-compiler-plugin选项

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <fork>true</fork>
      <meminitial>1024m</meminitial>
      <maxmem>2024m</maxmem>
    </configuration>
  </plugin>

答案 4 :(得分:3)

您在运行什么类型的操作系统?

为了分配超过2GB的内存,它必须至少是64位操作系统。

然后还有另一个问题。即使您的操作系统具有无限RAM,但是碎片的方式不是一个2GB的空闲块可用,您也会遇到内存异常。请记住,正常的堆内存只是VM进程正在使用的内存的一部分。因此,在32位机器上,您可能永远无法将Xmx设置为2048MB。

我还建议将最大内存设置为相同的值,因为在这种情况下,一旦VM耗尽内存,从开始就分配了第1个元素,然后VM分配一个新块(假设在分配之后,它会增加1,5MB块),它会将块1中的所有内容复制到新块,然后释放内存。如果它再次耗尽内存,则会分配2GB,然后复制1.5 GB,暂时分配3.5GB内存。

答案 5 :(得分:2)

我在编译Druid.io时遇到同样的问题,增加MaxDirectMemorySize最终有效。

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

答案 6 :(得分:1)

以下配置在我的案例中工作

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <verbose>true</verbose>
        <fork>true</fork>
        <argLine>-XX:MaxPermSize=500M</argLine>
    </configuration>
</plugin>

尝试使用-XX:MaxPermSize而不是-XX:MaxPermGen

答案 7 :(得分:1)

_JAVA_OPTIONS="-Xmx3G" mvn clean install

答案 8 :(得分:0)

使用.mvn / jvm.config为我工作,还有与项目链接的额外好处。

答案 9 :(得分:0)

在Unix / Linux平台上构建项目时,请如下设置Maven选项语法。请注意,单个qoutation符号,而不是双qoutation。

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

答案 10 :(得分:0)

在使用cygwin或其他linux模拟器(git bash)的Windows大型项目中会发生这种情况。碰巧的是,两者都不适合我的项目,这是一个很大的开源项目。在sh脚本中,调用了两个mvn命令。内存大小会增长到大于Xmx中指定的堆大小,并且在大多数情况下,如果第二个Windows进程启动了,则堆大小会增加。这使得内存消耗更高。

在这种情况下,解决方案是使用批处理文件并减小Xmx大小,然后maven操作成功。如果有兴趣,我可以透露更多细节。

答案 11 :(得分:0)

有人已经提到32位操作系统的问题。就我而言,问题是我正在使用32位JDK进行编译。

答案 12 :(得分:0)

增加环境变量'MAVEN_OPTS'中的内存大小将有助于解决此问题。对我来说,从-Xmx756M增至-Xmx1024M是可行的。

答案 13 :(得分:0)

还需要安装 jar 文件,以便构建可以节省获取本地 jar 的内存。

在尝试所有这些“MAVEN_OPTS”环境变量后,以下命令对我有用。

从项目的根文件夹在终端上运行“mvn clean install -U”。