Maven Out of Memory构建失败

Kev*_*ith 83 out-of-memory pom.xml maven-3 maven 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)
Run Code Online (Sandbox Code Playgroud)

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

截至昨天,我已成功运行maven编译.

截至今天,我刚刚把我的堆增加到3 GB.另外,我只更改了2-3行代码,所以我不明白这个"内存不足"的错误.

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m
Run Code Online (Sandbox Code Playgroud)

编辑:我通过更改失败的模块的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>
Run Code Online (Sandbox Code Playgroud)

小智 127

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

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

分配编译过程可能不是最好的主意,因为那时你开始第二个过程忽略MAVEN_OPTS并使分析更加困难.

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

export MAVEN_OPTS="-Xmx3000m"
Run Code Online (Sandbox Code Playgroud)

并且不要将编译器分叉到不同的进程

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

MAVEN_OPTS不应该增加,因为如果perm sice是问题的原因,那么我会期待错误-XX:MaxPermSize=512m

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

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

  • 顺便说一句,mvn构建再次失败了你的建议. (2认同)

A_D*_*teo 32

回答提及另一个选项而不是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
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果您使用的是 JDK 8,则 MaxPermSize 将被忽略。 (2认同)

m3n*_*nda 14

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

我用过export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"和工作过.

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


Ily*_*lya 11

添加选项

-XX:MaxPermSize=512m
Run Code Online (Sandbox Code Playgroud)

到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>
Run Code Online (Sandbox Code Playgroud)

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

hah*_*ile 5

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

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
Run Code Online (Sandbox Code Playgroud)


Nar*_*chu 5

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

<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>
Run Code Online (Sandbox Code Playgroud)

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


小智 5

_JAVA_OPTIONS="-Xmx3G" mvn clean install
Run Code Online (Sandbox Code Playgroud)