java.lang.OutOfMemoryError: Przestrzeń sterty Java w Maven

123

Kiedy uruchamiam test Maven, pojawia się błąd java.lang.OutOfMemoryError. Wyszukuję w Google rozwiązania i próbowałem export MAVEN_OPTS=-Xmx1024m, ale nie zadziałało. Każdy zna inne rozwiązania tego problemu, przy okazji używam maven 3.0

Z góry dziękuję

Wklej tutaj komunikat o błędzie po uruchomieniu „mvn test -e”

Testy zakończone niepowodzeniem:
  ostrzeżenie (junit.framework.TestSuite $ 1)
  testDefaultPigJob_1 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)

Uruchomione testy: 11, niepowodzenia: 3, błędy: 0, pominięte: 0

10/11/01 13:37:18 INFO Executionengine.HExecutionEngine: Łączenie z hadoop fi
le system pod adresem: file: ///
[INFO] ----------------------------------------------- -------------------------
[INFO] BUILD FAILURE
[INFO] ----------------------------------------------- -------------------------
[INFO] Całkowity czas: 30,063s
[INFO] Zakończono o: poniedziałek, 1 listopada, 13:37:18 czasu PDT 2010
[INFO] Pamięć końcowa: 3M / 6M
[INFO] ----------------------------------------------- -------------------------
[BŁĄD] Nie udało się wykonać celu org.apache.maven.plugins: maven-surefire-plugin: 2.
5: test (test domyślny) w projekcie dw.pig: Wystąpiły niepowodzenia testu.
[BŁĄD]
[BŁĄD] Zobacz E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports fo
r wyniki poszczególnych testów.
[BŁĄD] -> [Pomoc 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Nie udało się wykonać celu o
rg.apache.maven.plugins: maven-surefire-plugin: 2.5: test (default-test) w projekcie
 dw.pig: Wystąpiły niepowodzenia testów.

Zapoznaj się z E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports, aby uzyskać informacje o pliku in
indywidualne wyniki badań.
        w org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 199)
        w org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 148)
        w org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 140)
        w org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct (LifecycleModuleBuilder.java:84)
        w org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct (LifecycleModuleBuilder.java:59)
        w org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ild (LifecycleStarter.java:183)
        w org.apache.maven.lifecycle.internal.LifecycleStarter.execute (Lifecycl
eStarter.java:161)
        w org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:314)
        w org.apache.maven.DefaultMaven.execute (DefaultMaven.java:151)
        w org.apache.maven.cli.MavenCli.execute (MavenCli.java:445)
        w org.apache.maven.cli.MavenCli.doMain (MavenCli.java:168)
        w org.apache.maven.cli.MavenCli.main (MavenCli.java:132)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (metoda natywna)
        w 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)
        w org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Laun
cher.java:290)
        w org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.jav
za: 230)
        w org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (La
uncher.java:409)
        w org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:
352)
Przyczyna: org.apache.maven.plugin.MojoFailureException: Wystąpiły niepowodzenia testów
.

Zapoznaj się z E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports, aby uzyskać informacje o pliku in
indywidualne wyniki badań.
        na org.apache.maven.plugin.surefire.SurefirePlugin.execute (SurefirePlugi
n.java:629)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (domyślnie
BuildPluginManager.java:107)
        w org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 195)
        ... 19 więcej
[BŁĄD]
[BŁĄD] Uruchom ponownie Mavena, używając przełącznika -X, aby włączyć pełne rejestrowanie debugowania.
[BŁĄD]
[BŁĄD] Aby uzyskać więcej informacji o błędach i możliwych rozwiązaniach, zajrzyj do
d następujące artykuły:
[BŁĄD] [Pomoc 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
zjffdu
źródło
Może masz wyciek pamięci w swoim teście? Pomimo tego, że jest on zbierany jako śmieci, nadal możesz utworzyć wyciek pamięci w java: ibm.com/developerworks/library/j-leaks
anio

Odpowiedzi:

158

Kiedy uruchamiam test Maven, pojawia się błąd java.lang.OutOfMemoryError. Wyszukuję w Google rozwiązania i próbowałem wyeksportować MAVEN_OPTS = -Xmx1024m, ale to nie zadziałało.

Ustawienie Xmxopcji za pomocą MAVEN_OPTSdziała, ale konfiguruje JVM używaną do uruchamiania Mavena. Że pod uwagę, że Maven-murowany-plugin widelce nowego JVM domyślnie, a twoje MAVEN_OPTSnie są więc przekazywane.

Aby skonfigurować rozmiar maszyny JVM używanej przez wtyczkę maven-surefire-plugin, należałoby albo:

  • zmienić forkModesię never(co jest być nie tak dobry pomysł, bo Maven nie będą izolowane od testu) ~ lub ~
  • użyj argLineparametru (we właściwy sposób):

W późniejszym przypadku coś takiego:

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

Ale muszę powiedzieć, że raczej się zgadza ze Szczepanem tutaj, jest bardzo prawdopodobne, coś nie tak z jednego testu i nie jestem pewien, że daje więcej pamięci jest dobrym rozwiązaniem, aby „rozwiązać” (ukrycia?) Problemu.

Bibliografia

Pascal Thivent
źródło
1
Czy aktualizujesz tag <configuration> tylko w swoim nadrzędnym pom.xml?
Kevin Meredith
3
forkModezostał wycofany: maven.apache.org/surefire/maven-surefire-plugin/…
Macarse
1
@Macarse forkModezostał przestarzały, ale myślę, że tylko zostanie zastąpiony, forkCountktóry ma podobną funkcjonalność. Jednym ze sposobów użycia MAVEN_OPTS jest, <argLine>${env.MAVEN_OPTS}</argLine>ale najwyraźniej nie jest to zalecane, ponieważ może się różnić w zależności od komputera ( stackoverflow.com/a/10463133/32453 ). Pamiętaj również, że jeśli używasz jacoco, powinieneś ustawić argLine w inny sposób stackoverflow.com/questions/12269558/maven-jacoco-plugin-error
rogerdpack
63

Dla nowych w Maven (takich jak ja) tutaj jest cała konfiguracja, która znajduje się w sekcji kompilacji twojego pom. Twoje zdrowie.

<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
źródło
12

Istnieje prawdopodobieństwo, że problem tkwi w jednym z testów jednostkowych, o wykonanie których poprosiłeś Mavena.

W związku z tym manipulowanie rozmiarem sterty jest niewłaściwym podejściem. Zamiast tego powinieneś przyjrzeć się testowi jednostkowemu, który spowodował OOME, i spróbować dowiedzieć się, czy jest to błąd testu jednostkowego, czy kodu, który testuje.

Zacznij od spojrzenia na ślad stosu. Jeśli go nie ma, uruchom mvn ... testponownie z -eopcją.

Stephen C.
źródło
@ Stephen, mogę zdać przypadek testowy w eclipse po ustawieniu Xmx1024m w konfiguracji uruchamiania, ale zawsze wyrzucam OutOfMemoryError, gdy uruchamiam "mvn test" w konsoli, nawet gdy dodam opcje -e "mvn test -DMAVEN_OPTS = -Xmx1024m "
zjffdu
2
@zjffdu - Całkowicie przegapiłeś mój punkt widzenia! Celem dodania "-e" nie jest sprawienie, by testy działały. Chodzi o to, aby dowiedzieć się, dlaczego nie działają.
Stephen C
1
@zjffdu - w takim przypadku musisz to debugować na własnej skórze, tak jak w przypadku innych problemów z Javą.
Stephen C
2
Ten problem pojawia się podczas uruchamiania przypadków testowych GWT, które symulują pełne środowisko przeglądarki. Czasami można zwiększyć rozmiar sterty.
djjeck
1
@djjeck - Tak, czasami. Ale uważam, że przez większość czasu nie jest to właściwe rozwiązanie.
Stephen C
8

Aby tymczasowo obejść ten problem, okazało się, że najszybszym sposobem jest:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
Max Hohenegger
źródło
6

Rozwiązałem ten problem po mojej stronie na 2 sposoby:

  1. Dodanie tej konfiguracji w pom.xml

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. Przejdź na używany JDK 1.7 zamiast 1.6

Minh Dang
źródło
2

Aby rozwiązać java.lang.OutOfMemoryError: przestrzeń sterty Java w Maven, spróbuj skonfigurować poniższą konfigurację w 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>
Narayan Yerrabachu
źródło
1
+1 za wzmiankę o MaxPermSize. Jeśli błąd braku pamięci jest spowodowany ładowaniem miliardów klas, takich jak tworzenie nowego HiveContext w teście jednostkowym, to jest rozwiązanie.
swdev
-2

Nie tylko pamięć sterty. również zwiększ rozmiar perm, aby rozwiązać ten wyjątek w maven, użyj tych zmiennych w zmiennej środowiskowej.

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

Przykład:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"
e2rabi
źródło
Wtedy błąd nie byłby "przestrzenią sterty Java", ale inny.
Karl Richter