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构build错误。

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

你在说什么样的“networking”模块? 这是一场简单的战争,还是打包型战争?

如果你不使用Google的networking工具包(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 sice是问题的原因,那么我会期望错误java.lang.OutOfMemoryError: PermGen space

如果这不能解决您的问题,那么您可以通过添加-XX:+HeapDumpOnOutOfMemoryError来创build堆转储以进一步分析。 另外,你可以在你的java的bin目录下使用jconsole.exe连接到jvm,而编译运行的时候,看看jvm堆里面发生了什么。

另一个想法(可能是一个愚蠢的),是否你的机器内有足够的内存? 定义内存大小是不错的,但是如果你的主机只有4GB,那么你可能会遇到Java不能使用已定义的内存的问题,因为它已经被OS,Java,MS-Office …所使用。

回答迟到提到另一个选项,而不是常见的MAVEN_OPTS环境variables传递给Maven构build所需的JVM选项。

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

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

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

在Maven中,在每个项目基础上定义JVMconfiguration并不简单。 基于环境variablesMAVEN_OPTS的现有机制以及${user.home}/.mavenrc是另一种select,其缺点是不属于项目的一部分。

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

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

这种方法的主要优点是configuration与相关项目是分离的,并且适用于整个构build,而且对于在同一项目中工作的其他开发人员(忘记设置), MAVEN_OPTS脆弱程度要低于MAVEN_OPTS
而且,在多模块项目的情况下,这些选项将被应用于所有模块。

我得到了同样的问题,试图编译“干净安装”使用低端512Mb内存VPS和良好的CPU。 运行OutOfMemory并重复地杀死脚本。

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

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

添加选项

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

你在运行什么types的操作系统?

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

那么还有另一个问题。 即使您的操作系统具有无限制的内存,但是这种碎片的方式并不是一个2GB的空闲块,也可能会导致内存exception。 请记住,正常的堆内存只是VM进程正在使用的内存的一部分。 所以在一台32位的机器上,你可能永远无法将Xmx设置为2048MB。

我也build议将最大内存设置为相同的值,因为在这种情况下,一旦VM耗尽内存,第一次从开始分配1GB,VM就分配一个新块(假设它随着500MB的块)的1.5GB的分配后,它将所有的东西从第一块复制到新的,然后释放内存。 如果内存再次用完,则分配2GB,然后复制1.5GB,暂时分配35GB的内存。

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

编译Druid.io时遇到了同样的问题,增加了MaxDirectMemorySize最后的工作。

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