94

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

14 回答 14

145

你在说什么样的“网络”模块?是单纯的战争,有包装式的战争吗?

如果您没有使用 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 堆内发生的情况。

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

于 2012-09-22T12:56:51.780 回答
40

回答晚了要提到另一个选项而不是通用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其他开发同一项目的开发人员更脆弱(忘记设置它)。
此外,如果是多模块项目,这些选项将应用于所有模块。

于 2016-03-14T21:50:25.640 回答
16

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

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

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

于 2015-01-19T06:06:22.800 回答
13

添加选项

-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>
于 2012-09-19T16:50:13.587 回答
6
_JAVA_OPTIONS="-Xmx3G" mvn clean install
于 2018-11-17T13:53:27.287 回答
5

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

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
于 2017-03-02T12:32:03.983 回答
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

于 2018-02-11T20:40:18.887 回答
3

你在什么类型的操作系统上运行?

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

然后还有另一个问题。即使您的操作系统有无限的 RAM,但它是碎片化的,没有一个 2GB 的空闲块可用,您也会出现内存不足的异常。请记住,普通堆内存只是 VM 进程正在使用的内存的一部分。因此,在 32 位机器上,您可能永远无法将 Xmx 设置为 2048MB。

我还建议将 min 和 max memory 设置为相同的值,因为在这种情况下,一旦 VM 内存不足,就会从一开始就分配 1GB 的第一个时间,然后 VM 会分配一个新块(假设它随着500MB 块)在分配 1,5GB 之后,它会将所有内容从块 1 复制到新的块,然后释放内存。如果它再次用完内存,则分配 2GB,然后复制 1.5GB,临时分配 3.5GB 内存。

于 2012-09-28T14:46:15.537 回答
2

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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
于 2018-07-19T06:18:09.110 回答
0

使用 .mvn/jvm.config 对我有用,另外还有与项目链接的额外好处。

于 2016-03-23T18:39:20.473 回答
0

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

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

于 2019-01-07T20:48:06.013 回答
0

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

于 2019-08-22T09:22:28.510 回答
0

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

于 2020-07-30T07:18:57.100 回答
0

还需要安装 jar 文件,以便构建可以节省获取本地 jar 的内存。

在尝试了所有那些“MAVEN_OPTS”环境变量之后,下面的命令对我有用。

从项目的根文件夹在终端上运行“mvn clean install -U”。

于 2021-02-22T10:15:53.843 回答