java.lang.OutOfMemoryError:Maven中的Java堆空间


122

当我运行Maven测试时,发生java.lang.OutOfMemoryError。我在Google上搜索了解决方案,并尝试了export MAVEN_OPTS=-Xmx1024m,但没有成功。任何人都知道此问题的其他解决方案,顺便说一句,我正在使用Maven 3.0

提前致谢

运行“ mvn test -e”时,将错误消息粘贴到此处

测试失败:
  警告(junit.framework.TestSuite $ 1)
  testDefaultPigJob_1(com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2(com.snda.dw.pig.impl.DefaultPigJobLocalTest)

测试运行:11,失败:3,错误:0,跳过:0

01/10/11 13:37:18信息executionengine.HExecutionEngine:连接到hadoop fi
文件系统位于:file:///
[INFO] ----------------------------------------------- -------------------------
[INFO]建立失败
[INFO] ----------------------------------------------- -------------------------
[INFO]总时间:30.063s
[INFO]完成于:太平洋夏令时间2010年11月1日星期一13:37:18
[INFO]最终内存:3M / 6M
[INFO] ----------------------------------------------- -------------------------
[错误]无法执行目标org.apache.maven.plugins:maven-surefire-plugin:2。
项目dw.pig上的5:test(默认测试):有测试失败。
[错误]
[错误]请参阅E:\ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports fo
r各个测试结果。
[错误]-> [帮助1]
org.apache.maven.lifecycle.LifecycleExecutionException:无法执行目标o
rg.apache.maven.plugins:maven-surefire-plugin:2.5:test(默认测试)在项目上
 dw.pig:有测试失败。

请参阅E:\ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports中的
个别测试结果。
        在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:199)
        在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:148)
        在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:140)
        在org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:84)
        在org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:59)
        在org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ild(LifecycleStarter.java:183)
        在org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycle
eStarter.java:161)
        在org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314)
        在org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151)
        在org.apache.maven.cli.MavenCli.execute(MavenCli.java:445)
        在org.apache.maven.cli.MavenCli.doMain(MavenCli.java:168)
        在org.apache.maven.cli.MavenCli.main(MavenCli.java:132)
        在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
        在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。
Java:39)
        在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        在java.lang.reflect.Method.invoke(Method.java:597)
        在org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun
cher.java:290)
        在org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:230)
        在org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:409)
        在org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
352)
引起原因:org.apache.maven.plugin.MojoFailureException:存在测试失败
。

请参阅E:\ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports中的
个别测试结果。
        在org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugi
n.java:629)
        在org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(默认
BuildPluginManager.java:107)
        在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:195)
        ...另外19个
[错误]
[错误]使用-X开关重新运行Maven以启用完整的调试日志记录。
[错误]
[ERROR]有关错误和可能的解决方案的更多信息,请重新获取
d以下文章:
[错误] [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc

也许您的测试中存在内存泄漏?尽管已进行垃圾收集,您仍然可以在Java中创建内存泄漏:ibm.com/developerworks/library/j-leaks
anio

Answers:


158

当我运行Maven测试时,发生java.lang.OutOfMemoryError。我在Google上搜索了解决方案,并尝试导出MAVEN_OPTS = -Xmx1024m,但没有成功。

使用设置Xmx选项MAVEN_OPTS确实有效,它确实配置了用于启动Maven的JVM。话虽如此,默认情况下,maven-surefire-plugin 派生了一个新的JVM,MAVEN_OPTS因此您的未通过。

要配置由maven-surefire-plugin使用的JVM的大小,您必须:

  • 更改forkModenever(这不是一个好主意,因为Maven不会与测试隔离)〜或〜
  • 使用argLine参数(正确的方法):

在后一种情况下,如下所示:

<configuration>
  <argLine>-Xmx1024m</argLine>
</configuration>

但是我不得不说,我倾向于在这里同意Stephen的观点,您的一项测试很可能出了点问题,而且我不确定提供更多的内存是“解决”(隐藏?)问题的正确解决方案。

参考资料


1
您是否仅在父pom.xml中更新<configuration>标记?
凯文·梅雷迪斯


1
@Macarse forkMode已被弃用,但我认为只能forkCount由具有类似功能的替换。可以使用MAVEN_OPTS的一种方法是,<argLine>${env.MAVEN_OPTS}</argLine>但是显然不建议这样做,因为它可能因计算机而异(stackoverflow.com/a/10463133/32453)。还要注意,如果您使用的是jacoco,则应该以不同的方式设置argLine stackoverflow.com/questions/12269558/maven-jacoco-plugin-error
rogerdpack 2015年

63

对于Maven的新手(例如我),这里是pom的build部分中的整个配置。干杯。

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19</version>
        <configuration>
            <argLine>-Xmx1024m</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>

12

问题可能出在您要求Maven运行的单元测试之一中。

因此,摆弄堆大小是错误的方法。相反,您应该查看引起OOME的单元测试,并尝试找出是单元测试的故障还是正在测试的代码。

首先查看堆栈跟踪。如果没有,请mvn ... test使用该-e选项再次运行。


@Stephen,在运行配置中设置Xmx1024m后,我可以在Eclipse中通过测试用例,但是当我在控制台中运行“ mvn test”时,即使添加-e选项“ mvn test -DMAVEN_OPTS = -Xmx1024m”,它总是会抛出OutOfMemoryError “
zjffdu

2
@zjffdu-您完全错过了我的观点!添加“ -e”的目的不是使测试正常工作。这是找出它们为什么不起作用的原因。
Stephen C

1
@zjffdu-在这种情况下,您将需要像这样的其他Java问题一样,以困难的方式调试它。
Stephen C

2
我在运行GWT测试用例时遇到了这个问题,该用例模拟了完整的浏览器环境。有时可以增加堆大小。
djjeck

1
@djjeck-有时候是的。但我认为大多数情况下这不是正确的解决方案。
斯蒂芬C,

8

为了暂时解决此问题,我发现以下是最快的方法:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

6

我已经通过两种方法解决了这个问题:

  1. 在pom.xml中添加此配置

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. 切换到使用的JDK 1.7而不是1.6


2

为了解决java.lang.OutOfMemoryError:Maven中的Java堆空间,请尝试在pom中配置以下配置

<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>

1
+1表示MaxPermSize。如果您的内存不足错误是由加载大量的类(例如在单元测试中创建新的HiveContext)引起的,那么这就是您的解决方案。
swdev

-2

不仅堆内存。还增加了烫发的大小,以解决maven中使用环境变量中的这些变量的异常。

variable name: MAVEN_OPTS
variable value: -Xmx512m -XX:MaxPermSize=256m

范例:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"

那么错误将不是“ Java堆空间”,而是不同的。
卡尔·里希特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.