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

Posted

技术标签:

【中文标题】java.lang.OutOfMemoryError:Maven 中的 Java 堆空间【英文标题】:java.lang.OutOfMemoryError: Java heap space in Maven 【发布时间】:2011-05-03 06:12:50 【问题描述】:

当我运行 maven 测试时,java.lang.OutOfMemoryError 发生了。我在谷歌上搜索了解决方案并尝试了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 10/11/01 13:37:18 INFO executionengine.HExecutionEngine:连接到 hadoop fi 文件系统位于:file:/// [信息] --------------------------------------------- ------------------------- [信息] 构建失败 [信息] --------------------------------------------- ------------------------- [INFO] 总时间:30.063s [信息] 完成于:2010 年 11 月 1 日星期一 13:37:18 PDT [INFO] 最终内存:3M/6M [信息] --------------------------------------------- ------------------------- [错误] 无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:2。 5:test (default-test) on project dw.pig: 有测试失败。 [错误] [错误] 请参考 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 (default-test) 项目 dw.pig:有测试失败。 请参考 E:\Code\Java\workspace\dw.pig\target\surefire-reports 的 in 个别化验结果。 在 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(生命周期 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(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。 爪哇: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 一个: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 的 in 个别化验结果。 在 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 以启用完整的调试日志记录。 [错误] [错误] 有关错误和可能的解决方案的更多信息,请阅读 d 以下文章: [错误] [帮助 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc

【问题讨论】:

也许您的测试中有内存泄漏?尽管它被垃圾回收了,你仍然可以在 java 中创建内存泄漏:ibm.com/developerworks/library/j-leaks 【参考方案1】:

当我运行 maven 测试时,会发生 java.lang.OutOfMemoryError。我用谷歌搜索解决方案并尝试导出 MAVEN_OPTS=-Xmx1024m,但它没有用。

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

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

forkMode 更改为never(这不是一个好主意,因为Maven 不会与测试隔离)~或~ 使用argLine参数(正确方式):

在后一种情况下,是这样的:

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

但是我不得不说我倾向于同意 Stephen 的观点,你的一项测试很可能有问题,我不确定提供更多内存是解决问题的正确方法“解决”(隐藏?)你的问题。

参考文献

Maven 2 Surefire Plugin Classloading and Forking in Maven Surefire

【讨论】:

你是否只在你的父 pom.xml 中更新 标签? forkMode 已被弃用:maven.apache.org/surefire/maven-surefire-plugin/… @Macarse forkMode 已被弃用,但我认为只能替换为具有类似功能的forkCount。您可以使用 MAVEN_OPTS 的一种方法是&lt;argLine&gt;$env.MAVEN_OPTS&lt;/argLine&gt;,但显然不建议这样做,因为它可能因计算机而异(***.com/a/10463133/32453)。另请注意,如果您使用的是 jacoco,则应该以不同的方式设置 argLine ***.com/questions/12269558/maven-jacoco-plugin-error【参考方案2】:

对于那些刚接触 Maven 的人(比如我),这里是您的 pom.xml 构建部分中的整个配置。干杯。

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

【讨论】:

在 IntelliJ 中启动 JUnit 测试时,您的解决方案会引发 JUnitException: TestEngine with ID 'junit-jupiter' failed to discover test【参考方案3】:

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

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

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

【讨论】:

@Stephen,在运行配置中设置-Xmx1024m 后,我可以在 eclipse 中通过测试用例,但是当我在控制台中运行“mvn test”时它总是抛出 OutOfMemoryError,即使我添加了 -e 选项"mvn 测试 -DMAVEN_OPTS=-Xmx1024m" @zjffdu - 你完全错过了我的意思!添加“-e”的目的不是为了使测试工作。这是为了找出它们为什么不起作用。 @zjffdu - 在这种情况下,您需要像处理其他 Java 问题一样进行艰难的调试。 我在运行 GWT 测试用例时遇到了这个问题,它模拟了一个完整的浏览器环境。有时可以增加堆大小。 @djjeck - 有时是的。但我认为大多数时候这不是正确的解决方案。【参考方案4】:

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

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

【讨论】:

【参考方案5】:

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

    在 pom.xml 中添加此配置

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

    切换到使用的 JDK 1.7 而不是 1.6

【讨论】:

【参考方案6】:

为了解决java.lang.OutOfMemoryError: Java heap space in Maven,尝试在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 用于提及 MaxPermSize。如果您的内存不足错误是由加载大量类(例如在单元测试中创建新 HiveContext)引起的,那么这就是您的解决方案。 Oracle 在 JDK 8 版本中完全删除了 Perm gen 空间。因此,设置 -XX:MaxPermSize 将给出警告:“OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0”【参考方案7】:

正如上面的答案中提到的,由于 Surefire 正在创建一个新的 JVM 来运行您的测试,您希望将 -Xmx1024m 传递给新的 JVM,而不是您启动 mvn test 的 JVM。

只是想补充一点,你可以在你的命令中这样做

mvn test -DargLine="-Xmx1024m"

与在 pom.xml 中的 Surefire 插件配置中添加 JVM 选项具有同等效果:

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

【讨论】:

【参考方案8】:

不仅是堆内存。还增加 perm 大小以解决 maven 中的异常在环境变量中使用这些变量。

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

例子:

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

【讨论】:

那么错误不会是“Java堆空间”,而是不同。

以上是关于java.lang.OutOfMemoryError:Maven 中的 Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章