在Windows系统下,如何在Maven 2中设置Java堆空间?

93

在我的项目构建过程中,我遇到了以下错误信息:

java.lang.OutOfMemoryError: Java heap space

如何增加堆空间?我有8GB的内存,很难想象maven会消耗那么多资源。我找到了这个链接,其中介绍了如何在Linux上设置,但我使用的是Windows 7。我该怎样在Windows下更改Java堆空间大小呢?


我假设你使用的是64位版本的Windows?如果不是,那么你无法指定超过1.5G的堆大小,因为JVM需要直接使用0.5G Windows允许的内存。有一种选项可以让Windows只使用1G的内核模式代码和3G的用户模式代码,但Sun JVM不允许你使用它。 - vickirk
@vickirk 我使用的是64位版本的Windows。 - Gandalf StormCrow
1
你是否也在使用64位版本的JVM?在JDK下载页面的下拉列表中,它将被列为Windows x64:http://java.sun.com/javase/downloads/widget/jdk6.jsp - Powerlord
8个回答

120
要设置的环境变量是MAVEN_OPTS,例如:MAVEN_OPTS=-Xmx1024m。在pom中的maxmem配置只适用于将编译器插件设置为fork javac到一个新的JVM时。否则,插件在与Maven相同的VM中运行,因此在通过命令行传递的内存中运行MAVEN_OPTS
要在Windows 7下设置MAVEN_OPTS:
  1. 右键单击我的电脑,选择属性(键盘快捷键按Windows+Pause/Break
  2. 单击系统属性左侧导航中的高级系统设置链接,以显示高级系统属性
  3. 转到高级选项卡并单击位于高级系统属性配置窗口底部的环境变量按钮
  4. 创建一个新的用户变量,将变量名称设置为MAVEN_OPTS,将变量值设置为-Xmx1024m(或更多)
打开一个新的命令窗口并运行mvn

1
这会对我的构建速度产生影响吗?有没有什么技巧可以通过为其分配更多内存来加速我的Maven构建? - Mahendran

45
如果在surefire(或failsafe)JUnit测试运行期间出现了堆空间不足的情况,那么更改MAVEN_OPTS可能无济于事。我一直在尝试使用不同的MAVEN_OPTS配置,但没有成功,直到我找到这篇文章才解决了问题。
基本上JUnits会分叉到它们自己的环境中,忽略MAVEN_OPTS中的设置。您需要在pom中配置surefire以为JUnits添加更多内存。
希望这可以节省其他人的时间!
编辑:复制解决方案Keith Chapman 的博客以防链接有一天会失效:
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

更新(2017年5月31日): 感谢@johnstosh指出这一点-自从我发布这个答案以来,Surefire已经发生了一些变化。这里是他们的文档和一个更新的代码示例(对于这个问题,arg行仍然是重要的部分):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>

它确实节省了我的一些时间!谢谢!不幸的是,我只能点赞一次! :) - javanna
这是最有用的答案,符合Maven的实际风格。谢谢! - Andremoniy
这是问题的实际答案。 - Jonathan E. Landrum
1
请查看surefire文档。之前的surefire版本使用参数forkMode进行配置分叉。虽然该参数仍然支持向后兼容,但强烈建议用户迁移其配置并改用forkCount和reuseForks。 - johnstosh

21

命令应该是相同的,只是用SET代替EXPORT。

  • set MAVEN_OPTS=-Xmx512m将为其分配512Mb的堆空间
  • set MAVEN_OPTS=-Xmx2048m将为其分配2Gb的堆空间

我同意应该是相同的命令,但这并不意味着它是正确的陈述,原因在于 C:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file. - Gandalf StormCrow
glowcoder 稍微有些错误。你不需要导出变量,但是如果要给它们赋值,你需要使用 set 命令。 - JeremyP
如果您想在每次构建时使用相同的值,您还可以将MAVEN_OPTS设置为Windows环境变量。 - digitaljoel
@Gandalf 你需要把 set 放在它前面 @Jeremy 是的,这就是为什么它说要使用 set 而不是 export - corsiKa

9
在Mac上: 不要使用JAVA_OPTSMAVEN_OPTS,而应该使用_JAVA_OPTIONS。这样做是有效的!

这也适用于Windows。将其添加为Maven运行配置的环境变量,在Eclipse中运行测试时,从m2e运行的测试不再出现PermGen错误。 - fedeb

3
尝试使用MAVEN_OPTS变量后没有成功,我发现这个网站对我很有用。所以我只需要在默认VM选项中添加-Xms128m -Xmx1024m即可。
要在Eclipse中更改这些设置,请转到“窗口”->“首选项”->“Java”->“已安装的JRE”,选择选中的JRE/JDK并单击编辑。

0

成功了 - 要在 Eclipse 中进行更改,依次选择窗口 -> 首选项 -> Java -> 已安装的 JRE。选择已选中的 JRE/JDK,然后点击编辑。

默认虚拟机参数 = -Xms128m -Xmx1024m


0

在Windows上:

添加一个环境变量(在系统和用户变量中都要添加,我有一些奇怪的问题,它从各种地方获取变量,所以我在这两个位置都添加了它们)。

将其命名为MAVEN_OPTS。

值将是:-Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

数字可以不同,使它们相对于您的内存大小。

我曾经遇到过这个问题,这个方法解决了它,没有其他方法!


-7

您正在寻找有关 java 的 2 个选项:

  • -Xmx 最大堆大小
  • -Xms 起始堆大小

将它们放入您对 java 可执行文件的命令行调用中,就像这样:

java -Xms512M -Xmx1024M my.package.MainClass

请记住,根据应用程序的不同,您可能希望起始堆大小和最大堆大小相同,这样可以避免在运行时调整堆大小(这可能会占用需要响应的应用程序的时间)。调整堆大小可能涉及移动许多对象并重新进行簿记。

对于日常项目,请将它们设置为您认为足够好的大小。使用性能分析工具以获取帮助。


1
正如 ebelisle 所述,这个选项根本不起作用,因为你使用 Maven 时必须至少指定一个 Maven 选项,即 "-D",但仍然不是我们所讨论的 Java 命令。 - frandevel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接