java.lang.OutOfMemoryError : Maven의 Java 힙 공간


123

maven 테스트를 실행하면 java.lang.OutOfMemoryError가 발생합니다. 솔루션을 찾기 위해 Google을 검색하고 시도했지만 export MAVEN_OPTS=-Xmx1024m작동하지 않았습니다. 누구나이 문제에 대한 다른 솔루션을 알고 있습니다 .BTW는 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 정보 executionengine.HExecutionEngine : hadoop fi에 연결
파일 시스템 : file : ///
[정보] ----------------------------------------------- -------------------------
[정보] 빌드 실패
[정보] ----------------------------------------------- -------------------------
[정보] 총 시간 : 30.063 초
[정보] 종료일 : Mon Nov 01 13:37:18 PDT 2010
[정보] 최종 메모리 : 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를 참조하십시오.
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 (Lifecycl
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)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.
java : 39)
        at 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 (Default
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

답변:


158

maven 테스트를 실행하면 java.lang.OutOfMemoryError가 발생합니다. 솔루션을 위해 Google을 검색하고 MAVEN_OPTS = -Xmx1024m을 내보내려고 시도했지만 작동하지 않았습니다.

do를 사용하여 Xmx옵션을 설정하면 MAVEN_OPTSMaven을 시작하는 데 사용되는 JVM이 구성됩니다. 즉, maven-surefire-plugin 은 기본적으로 새 JVM을 포크MAVEN_OPTS 하므로 전달되지 않습니다.

maven-surefire-plugin에서 사용하는 JVM의 크기를 구성하려면 다음 중 하나를 수행해야합니다.

  • 변경 forkModenever(메이븐 테스트에서 고립되지 않습니다 때문에 그리 좋은 생각을 할 수있는) ~ 나 ~
  • argLine매개 변수 사용 (올바른 방법) :

나중의 경우 다음과 같습니다.

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

하지만 저는 여기서 Stephen과 동의하는 경향이 있다고 말해야합니다. 테스트 중 하나에 문제가있을 가능성이 매우 높으며 더 많은 메모리를 제공하는 것이 문제를 "해결"(숨기기?)하는 올바른 해결책이라고 확신하지 못합니다.

참고 문헌


1
부모 pom.xml 내에서만 <configuration> 태그를 업데이트합니까?
Kevin Meredith

3
forkMode더 이상 사용되지 않습니다 : maven.apache.org/surefire/maven-surefire-plugin/…
Macarse

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

63

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>

12

문제가 Maven에 실행하도록 요청한 단위 테스트 중 하나에있을 가능성이 있습니다.

따라서 힙 크기를 조작하는 것은 잘못된 접근 방식입니다. 대신 OOME을 유발 한 단위 테스트를 살펴보고 그것이 단위 테스트의 결함인지 테스트중인 코드인지 알아 내야합니다.

스택 추적에서 시작하십시오. 없는 경우 옵션을 mvn ... test사용하여 다시 실행 하십시오 -e.


@Stephen, 실행 구성에서 Xmx1024m을 설정 한 후 이클립스에서 테스트 케이스를 통과 할 수 있지만 콘솔에서 "mvn test"를 실행하면 항상 OutOfMemoryError가 발생합니다. -e 옵션을 추가해도 "mvn test -DMAVEN_OPTS = -Xmx1024m "
zjffdu 2010

2
@zjffdu-내 요점을 완전히 놓쳤습니다! "-e"를 추가하는 목적은 테스트가 작동하도록하는 것이 아닙니다. 왜 그들이 작동하지 않는지 알아내는 것입니다.
Stephen C

1
@zjffdu-이 경우 다른 Java 문제와 마찬가지로 어려운 방식으로 디버깅해야합니다.
Stephen C

2
전체 브라우저 환경을 시뮬레이션하는 GWT 테스트 케이스를 실행하는 동안이 문제가 발생합니다. 때로는 힙 크기를 늘리는 것이 좋습니다.
djjeck 2013 년

1
@djjeck-가끔 그렇습니다. 그러나 나는 그것이 대부분의 경우 올바른 해결책이라고 생각하지 않습니다.
Stephen C

8

이 문제를 일시적으로 해결하기 위해 가장 빠른 방법은 다음과 같습니다.

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

6

나는이 문제를 두 가지 방법으로 해결했습니다.

  1. pom.xml에이 구성 추가

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. 1.6 대신 사용 된 JDK 1.7로 전환


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
MaxPermSize를 언급하면 ​​+1. 메모리 부족 오류가 단위 테스트에서 새 HiveContext 만들기와 같은 방대한 클래스를로드하여 발생하는 경우 이것이 해결책입니다.
swdev

-2

힙 메모리 뿐만이 아닙니다. 또한 maven에서 해당 예외를 해결하기 위해 perm 크기를 늘리십시오. 환경 변수에서 이러한 변수를 사용하십시오.

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

예 :

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

그러면 오류는 "Java 힙 공간"이 아니라 다릅니다.
Karl Richter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.