Maven内存不足构建失败


88

截至今天,我的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)

[ERROR]内存不足;要增加内存量,请在启动时使用-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>

1
您能否提供更多的堆栈跟踪信息?我很好奇,看看是什么原因导致String初始化用尽了内存。在MAVEN_OPTS中设置堆大小听起来像是要走的路,但是我的猜测是,某个地方有一个可笑的大字符串,您可能只是没有为它分配足够的内存-Xmx
爱德华·萨姆森

Answers:


136

您在谈论哪种“网络”模块?这是一场简单的战争,有包装式战争吗?

如果您不使用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不需要增加,因为如果烫发大小是问题的原因,那么我会期望该错误java.lang.OutOfMemoryError: PermGen space

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

我想到另一个想法(可能是一个愚蠢的想法),您的计算机内部是否有足够的RAM?定义内存大小是不错的选择,但是如果您的主机只有4GB,那么您可能会遇到Java无法使用定义的内存的问题,因为OS,Java,MS-Office已经使用了它。


感谢您的回复。您删除分叉的JVM的建议是否也适用于“ maven-surefire-plugin”?我尝试了您的建议,将MAVEN_OPTS的内存增加到3000。我的maven编译器没有分叉JVM的设置,因此不需要在此进行任何更改。是的,我的Guest VM有4 GB的RAM。主机具有8 GB RAM。
凯文·梅雷迪斯

2
顺便说一句,MVN构建再次失败,并提供了您的建议。
凯文·梅雷迪斯

1
通常,只要不让它运行,我就会尽量避免进程分叉。如果您的系统只有4GB,则OS使用约1GB。这样您就有了3GB的剩余空间。如果maven以Xms = 1GB开头,则剩余的可用内存为2GB。接下来,编译器派生以Xms = 1GB ....开始,从而将可用内存减少到1GB。现在,您可以减去分叉的故障安全插件过程PermGen内存128MB,...正如您所看到的那样,Xmx设置很可能永远不会用作JVM,因为该内存很简单,并非免费。您是否尝试过使用JConsole?和HeapDumpOnOutOfMemoryError吗?
vach 2012年

我从MAVEN_OPTS中删除了Xms1024m,但是mvn构建仍然失败。我在MAVEN_OPTS中添加了“ HeapDump ...”,但是我不确定在哪里打印转储。现在查看JConsole。
凯文·梅雷迪斯

转储位于jvms目录中
vach 2012年

36

稍后回答将提到另一个选项而不是通用MAVEN_OPTS环境变量,以传递给Maven构建所需的JVM选项。

从Maven 3.3.1开始,您可以.mvn在相关项目中包含一个文件夹,并在jvm.config该选项中拥有一个完美的文件位置。

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

作为官方发行说明的一部分

在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
请注意,如果您使用的是JDK 8,则会忽略MaxPermSize。–
GeraldScott

14

我在尝试使用Lowend 512Mb ram VPS和良好的CPU编译“全新安装”时遇到了同样的问题。再次运行OutOfMemory并杀死脚本。

我曾经export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"工作过。

仍然出现其他一些编译失败,因为这是我第一次需要Maven,但是OutOfMemory问题已经消失了。


11

添加选项

-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>

2
在发布本文之后,我实际上添加了选项-XX:MaxPermSize = 1024m。但是我仍然遇到内存不足的错误。另一篇SO帖子提到,我需要在maven-surefire-plugin的argLine中添加一个选项,以增加分叉线程使用的内存。我将其增加到<argLine> -Xms256m -Xmx1024m -XX:PermSize = 128m -XX:MaxPermSize = 512m </ argLine>
Kevin Meredith

我应该提到……不,Maven构建仍然失败。
凯文·梅雷迪斯

将所有这些属性添加maven-compilier-plugin并增加-XX:MaxPermSizeXmx应为=XX:MaxPermSize
Ilya 2012年

还可以在maven-compilier-plugin
Ilya 2012年

我尝试过(请参阅原始帖子),但是我的mvn构建仍然失败。
凯文·梅雷迪斯

4

编译Druid.io时遇到相同的问题,增加MaxDirectMemorySize终于可以了。

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

奇怪的是,默认情况下,MaxDirectMemorySize表面上是不受限制的(即,您添加了一个限制,而不是调整一个已经存在的限制)。
Tomer Gabel

4

下面的配置适用于我的情况

<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



3

您正在运行哪种类型的操作系统?

为了分配超过2GB的内存,它至少需要一个64位操作系统。

然后还有另一个问题。即使您的操作系统具有不受限制的RAM,但由于没有一个可用的2GB可用块而导致碎片化,您也会遇到内存不足的异常。并且请记住,普通的堆内存只是VM进程正在使用的内存的一部分。因此,在32位计算机上,您可能永远无法将Xmx设置为2048MB。

我还建议将最小最大内存设置为相同的值,因为在这种情况下,一旦虚拟机内存不足,就会从头开始分配第一时间1GB,然后虚拟机会分配一个新块(假设它随着分配了1,500 GB的500MB块)后,它将把所有内容从第一个块复制到新的块中,然后释放内存。如果再次用尽内存,则会分配2GB内存,然后复制1.5GB内存,从而临时分配3.5GB内存。


1

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

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

0

使用.mvn / jvm.config对我有用,而且具有与项目链接的附加好处。


0

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

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


0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.