ChatGPT解决这个技术问题 Extra ChatGPT

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

当我运行 Maven 测试时,会发生 java.lang.OutOfMemoryError。我用谷歌搜索了解决方案并尝试了 export MAVEN_OPTS=-Xmx1024m,但它不起作用。有人知道这个问题的其他解决方案吗?我正在使用 Maven 3.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
也许您的测试中有内存泄漏?尽管它被垃圾收集,您仍然可以在 java 中创建内存泄漏:ibm.com/developerworks/library/j-leaks

P
Pascal Thivent

当我运行 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>

但我不得不说,我在这里倾向于同意斯蒂芬的观点,你的一项测试很可能有问题,我不确定给予更多的记忆是“解决”(隐藏?)你的问题的正确解决方案。

参考

Maven 2 Surefire 插件

Maven Surefire 中的类加载和分叉


您是否仅在父 pom.xml 中更新 标记?
@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
M
Mohamed Taher Alrefaie

对于那些刚接触 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
S
Stephen C

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

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

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


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

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

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

M
Minh Dang

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

在 pom.xml 中添加这个配置 -Xmx1024m 切换到使用 JDK 1.7 而不是 1.6


N
Narayan Yerrabachu

为了解决 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”
I
Instein

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

只是想补充一点,您可以在命令中执行此操作,例如

mvn test -DargLine="-Xmx1024m"

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

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

e
e2rabi

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

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

例子 :

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

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