错误: Maven 中的 Java 堆空间

当我运行 Maven 测试时,发生 java.lang.OutOfMemoryError。我在谷歌上搜索了解决方案,并尝试了 export MAVEN_OPTS=-Xmx1024m,但它没有工作。 有人知道这个问题的其他解决方案吗? 我使用的是 Maven3.0

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

Failed tests:
warning(junit.framework.TestSuite$1)
testDefaultPigJob_1(com.snda.dw.pig.impl.DefaultPigJobLocalTest)
testDefaultPigJob_2(com.snda.dw.pig.impl.DefaultPigJobLocalTest)


Tests run: 11, Failures: 3, Errors: 0, Skipped: 0


10/11/01 13:37:18 INFO executionengine.HExecutionEngine: Connecting to hadoop fi
le system at: file:///
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.063s
[INFO] Finished at: Mon Nov 01 13:37:18 PDT 2010
[INFO] Final Memory: 3M/6M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.
5:test (default-test) on project dw.pig: There are test failures.
[ERROR]
[ERROR] Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports fo
r the individual test results.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal o
rg.apache.maven.plugins:maven-surefire-plugin:2.5:test (default-test) on project
dw.pig: There are test failures.


Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports for the in
dividual test results.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:199)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:148)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:140)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycl
eStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:445)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:168)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun
cher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
352)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures
.


Please refer to E:\Code\Java\workspace\dw.pig\target\surefire-reports for the in
dividual test results.
at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugi
n.java:629)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(Default
BuildPluginManager.java:107)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:195)
... 19 more
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
206221 次浏览

问题可能出现在您要求 Maven 运行的某个单元测试中。

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

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

当我运行 maven test java.lang。发生 OutOfMemory 错误。我谷歌它的解决方案,并试图导出 MAVEN _ OPTS =-Xmx1024m,但它没有工作。

使用 MAVEN_OPTS设置 Xmx选项是可行的,它确实配置了用于启动 Maven 的 JVM。也就是说,maven-surefire-plugin 叉子默认情况下是一个新的 JVM,因此您的 MAVEN_OPTS没有通过。

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

  • forkMode改为 never(这不是一个好主意,因为 Maven 不会从测试中孤立出来) ~ 或 ~
  • 使用 argLine参数(正确的方法) :

在后面的例子中,大概是这样的:

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

但是我不得不说我倾向于同意 Stephen 的观点,你的一个测试很可能有问题,我不确定给予更多的记忆是解决问题的正确方法(隐藏?)你的问题。

参考文献

对于那些刚刚接触 Maven 的人(比如我) ,这里有一个完整的配置,它会出现在你的 pom 的构建部分。干杯。

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

我用两种方法解决了这个问题:

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

    <configuration><argLine>-Xmx1024m</argLine></configuration>
    
  2. Switch to used JDK 1.7 instead of 1.6

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

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

例如:

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

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

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

为了在 Maven 中解析 Java.lang.OutOfMemoryError: 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>

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

只是想补充一下,你可以用你的命令

mvn test -DargLine="-Xmx1024m"

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

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