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并不简单。 基于环境variables
MAVEN_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"