截至今天,我的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>
答案 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”。