java.lang.OutOfMemoryError: Java-Heapspeicher in Maven

122

Wenn ich einen Maventest ausführe, passiert java.lang.OutOfMemoryError. Ich google es nach Lösungen und habe es versucht export MAVEN_OPTS=-Xmx1024m, aber es hat nicht funktioniert. Jeder kennt andere Lösungen für dieses Problem, übrigens verwende ich Maven 3.0

Danke im Voraus

Fügen Sie hier die Fehlermeldung ein, wenn Sie "mvn test -e" ausführen.

Fehlgeschlagene Tests:
  Warnung (junit.framework.TestSuite $ 1)
  testDefaultPigJob_1 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)

Testlauf: 11, Fehler: 3, Fehler: 0, Übersprungen: 0

10/11/01 13:37:18 INFO Executionengine.HExecutionEngine: Verbindung zu Hadoop Fi herstellen
Das System unter: file: ///
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] FEHLER ERSTELLEN
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] Gesamtzeit: 30.063s
[INFO] Fertiggestellt am: Mon Nov 01 13:37:18 PDT 2010
[INFO] Endspeicher: 3M / 6M
[DIE INFO] ----------------------------------------------- -------------------------
[FEHLER] Fehler beim Ausführen des Ziels org.apache.maven.plugins: maven-surefire-plugin: 2.
5: Test (Standardtest) für Projekt dw.pig: Es gibt Testfehler.
[ERROR]
[FEHLER] Weitere Informationen finden Sie unter E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports fo
r die einzelnen Testergebnisse.
[FEHLER] -> [Hilfe 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Ziel o konnte nicht ausgeführt werden
rg.apache.maven.plugins: Maven-Surefire-Plugin: 2.5: Test (Standardtest) für Projekt
 dw.pig: Es gibt Testfehler.

Weitere Informationen finden Sie unter E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports
einzelne Testergebnisse.
        unter org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
Java: 199)
        unter org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 148)
        unter org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 140)
        unter org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct (LifecycleModuleBuilder.java:84)
        unter 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)
        bei org.apache.maven.cli.MavenCli.execute (MavenCli.java:445)
        unter org.apache.maven.cli.MavenCli.doMain (MavenCli.java:168)
        unter org.apache.maven.cli.MavenCli.main (MavenCli.java:132)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode)
        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)
        unter org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.jav
a: 230)
        unter org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (La
uncher.java:409)
        unter org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:
352)
Auslöser: org.apache.maven.plugin.MojoFailureException: Es liegen Testfehler vor
.

Weitere Informationen finden Sie unter E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports
einzelne Testergebnisse.
        unter org.apache.maven.plugin.surefire.SurefirePlugin.execute (SurefirePlugi
n.java:629)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (Standard
BuildPluginManager.java:107)
        unter org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
Java: 195)
        ... 19 mehr
[ERROR]
[FEHLER] Führen Sie Maven erneut mit dem Schalter -X aus, um die vollständige Debug-Protokollierung zu aktivieren.
[ERROR]
[FEHLER] Weitere Informationen zu Fehlern und möglichen Lösungen finden Sie hier
d die folgenden Artikel:
[FEHLER] [Hilfe 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
zjffdu
quelle
Vielleicht haben Sie einen Speicherverlust in Ihrem Test? Obwohl es sich um Müll handelt, können Sie in Java immer noch einen Speicherverlust verursachen: ibm.com/developerworks/library/j-leaks
anio

Antworten:

158

Wenn ich einen Maventest ausführe, passiert java.lang.OutOfMemoryError. Ich google es nach Lösungen und habe versucht, MAVEN_OPTS = -Xmx1024m zu exportieren, aber es hat nicht funktioniert.

Das Festlegen der XmxOptionen mithilfe von MAVEN_OPTSfunktioniert, konfiguriert die JVM, die zum Starten von Maven verwendet wird. That being said, Maven-todsichere-Plugin Gabeln eine neue JVM standardmäßig und Ihr MAVEN_OPTSsind somit nicht bestanden.

Um die Größe der vom Maven-Surefire-Plugin verwendeten JVM zu konfigurieren, müssten Sie entweder:

  • ändere das forkModein never(was eine nicht so gute Idee ist, weil Maven nicht vom Test isoliert wird) ~ oder ~
  • Verwenden Sie den argLineParameter (der richtige Weg):

Im späteren Fall so etwas:

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

Aber ich muss sagen, dass ich Stephen hier eher zustimme. Es ist sehr wahrscheinlich, dass mit einem Ihrer Tests etwas nicht stimmt, und ich bin mir nicht sicher, ob es die richtige Lösung ist, mehr Speicher zu geben, um Ihr Problem zu "lösen" (zu verbergen?).

Verweise

Pascal Thivent
quelle
1
Aktualisieren Sie das <configuration> -Tag nur in Ihrer übergeordneten pom.xml?
Kevin Meredith
3
forkModewurde veraltet: maven.apache.org/surefire/maven-surefire-plugin/…
Macarse
1
@Macarse forkModeist veraltet, aber ich denke nur ersetzt zu werden, forkCountdie ähnliche Funktionen hat. Eine Möglichkeit, MAVEN_OPTS zu verwenden, besteht darin <argLine>${env.MAVEN_OPTS}</argLine>, dass dies anscheinend nicht empfohlen wird, da es von Computer zu Computer unterschiedlich sein kann ( stackoverflow.com/a/10463133/32453 ). Beachten Sie auch, dass Sie, wenn Sie Jacoco verwenden, argLine auf eine andere Weise einstellen
rogerdpack
63

Für diejenigen, die neu bei Maven sind (wie ich), ist hier die gesamte Konfiguration, die im Build-Bereich Ihres Poms enthalten ist. Prost.

<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>
user738048
quelle
12

Die Chancen stehen gut, dass das Problem in einem der Unit-Tests liegt, zu deren Ausführung Sie Maven aufgefordert haben.

Daher ist das Herumspielen mit der Heap-Größe der falsche Ansatz. Stattdessen sollten Sie sich den Komponententest ansehen, der das OOME verursacht hat, und herausfinden, ob es sich um den Fehler des Komponententests oder des zu testenden Codes handelt.

Betrachten Sie zunächst die Stapelverfolgung. Wenn es keine gibt, führen Sie sie mvn ... testerneut mit der -eOption aus.

Stephen C.
quelle
@ Stephen, ich kann den Testfall in Eclipse bestehen, nachdem ich-Xmx1024m in der Ausführungskonfiguration festgelegt habe, aber es wird immer OutOfMemoryError ausgelöst, wenn ich "mvn test" in der Konsole ausführe, selbst wenn ich -e Optionen "mvn test -DMAVEN_OPTS = -Xmx1024m" hinzufüge "
zjffdu
2
@zjffdu - Du hast meinen Standpunkt völlig verfehlt! Der Zweck des Hinzufügens von "-e" besteht nicht darin, dass die Tests funktionieren. Es ist herauszufinden, warum sie nicht funktionieren.
Stephen C
1
@zjffdu - In diesem Fall müssen Sie dies auf die harte Tour debuggen, wie bei anderen Java-Problemen.
Stephen C
2
Ich bekomme dieses Problem beim Ausführen von GWT-Testfällen, die eine vollständige Browserumgebung simulieren. Manchmal ist es in Ordnung, die Heap-Größe zu erhöhen.
Djjeck
1
@djjeck - Ja manchmal. Aber ich denke nicht, dass es die meiste Zeit die richtige Lösung ist.
Stephen C
8

Um dieses Problem vorübergehend zu umgehen, fand ich Folgendes am schnellsten:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
Max Hohenegger
quelle
6

Ich habe dieses Problem auf meiner Seite auf zwei Arten gelöst:

  1. Hinzufügen dieser Konfiguration in pom.xml

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. Wechseln Sie zu verwendetem JDK 1.7 anstelle von 1.6

Minh Dang
quelle
2

Versuchen Sie, die folgende Konfiguration in pom zu konfigurieren, um java.lang.OutOfMemoryError: Java-Heapspeicher in Maven aufzulösen

<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>
Narayan Yerrabachu
quelle
1
+1 für die Erwähnung von MaxPermSize. Wenn Ihr Speicherfehler durch das Laden von Millionen Klassen wie das Erstellen eines neuen HiveContext in Ihrem Komponententest verursacht wird, ist dies Ihre Lösung.
swdev
-2

Nicht nur Heapspeicher. Erhöhen Sie auch die Dauerwellengröße, um diese Ausnahme in Maven zu beheben. Verwenden Sie diese Variablen in Umgebungsvariablen.

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

Beispiel:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"
e2rabi
quelle
Dann wäre der Fehler nicht "Java Heap Space", sondern anders.
Karl Richter