131 votes

Java.lang.OutOfMemoryError: Espace de heap Java dans Maven

Lorsque je lance maven test, une java.lang.OutOfMemoryError se produit. J'ai cherché des solutions en ligne et j'ai essayé d' exporter MAVEN_OPTS=-Xmx1024m, mais cela n'a pas fonctionné. Quelqu'un connait-il d'autres solutions pour ce problème? J'utilise maven 3.0

Collez le message d'erreur ici lorsque vous exécutez mvn test -e

Tests en échec:
  warning(junit.framework.TestSuite$1)
  testDefaultPigJob\_1(com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob\_2(com.snda.dw.pig.impl.DefaultPigJobLocalTest)

Tests exécutés: 11, Échecs: 3, Erreurs: 0, Ignorés: 0

10/11/01 13:37:18 INFO executionengine.HExecutionEngine: Connexion au système de fichiers hadoop sur: file:///
\[INFO\] ------------------------------------------------------------------------
\[INFO\] ÉCHEC DE LA CONSTRUCTION
\[INFO\] ------------------------------------------------------------------------
\[INFO\] Temps total: 30.063s
\[INFO\] Terminé à: Lun Nov 01 13:37:18 PDT 2010
\[INFO\] Mémoire finale: 3M/6M
\[INFO\] ------------------------------------------------------------------------
\[ERROR\] Échec de l'exécution du goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test (default-test) sur le projet dw.pig: Il y a des échecs de test.
\[ERROR\]
\[ERROR\] Veuillez consulter E:\\Code\\Java\\workspace\\dw.pig\\target\\surefire-reports pour les résultats des tests individuels.
\[ERROR\] -> \[Aide 1\]
org.apache.maven.lifecycle.LifecycleExecutionException: Échec de l'exécution du goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test (default-test) sur le projet dw.pig: Il y a des échecs de test.

Veuillez consulter E:\\Code\\Java\\workspace\\dw.pig\\target\\surefire-reports pour les résultats des tests individuels.
         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.buildProject(LifecycleModuleBuilder.java:84)
         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
         at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
         at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.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(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:597)
         at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
         at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
         at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
         at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoFailureException: Il y a des échecs de test.

Veuillez consulter E:\\Code\\Java\\workspace\\dw.pig\\target\\surefire-reports pour les résultats des tests individuels.
          at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugin.java:629)
          at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107)
          at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:195)
          ... 19 more
\[ERROR\]
\[ERROR\] Re-exécutez Maven en utilisant l'option -X pour activer un journal de débogage complet.
\[ERROR\]
\[ERROR\] Pour plus d'informations sur les erreurs et les solutions possibles, veuillez lire les articles suivants:
\[ERROR\] \[Aide 1\] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc

0 votes

Peut-être avez-vous une fuite de mémoire dans votre test? Malgré le fait qu'il soit récupéré par le ramasse-miettes, vous pouvez toujours créer une fuite de mémoire en Java : ibm.com/developerworks/library/j-leaks

168voto

Pascal Thivent Points 295221

Lorsque je lance maven test, java.lang.OutOfMemoryError se produit. Je l'ai googlé pour trouver des solutions et j'ai essayé d'exporter MAVEN_OPTS=-Xmx1024m, mais cela n'a pas fonctionné.

Le fait de définir les options Xmx en utilisant MAVEN_OPTS fonctionne, cela configure le JVM utilisé pour démarrer Maven. Cela dit, le maven-surefire-plugin forks un nouveau JVM par défaut, et vos MAVEN_OPTS ne sont donc pas transmises.

Pour configurer la taille du JVM utilisé par le maven-surefire-plugin, vous devriez soit :

  • changer le forkMode en never (ce qui n'est pas forcément une bonne idée car Maven ne sera pas isolé du test) ~ou~
  • utiliser le paramètre argLine (la bonne façon) :

Dans ce dernier cas, quelque chose comme ceci :

  -Xmx1024m

Mais je dois dire que je suis plutôt d'accord avec Stephen ici, il y a très probablement quelque chose qui ne va pas avec un de vos tests et je ne suis pas sûr que donner plus de mémoire soit la bonne solution pour "résoudre" (cacher ?) votre problème.

Références

1 votes

Mettez-vous à jour la balise uniquement dans votre fichier pom.xml parent?

3 votes

1 votes

@Macarse forkMode a été déprécié, mais je pense qu'il suffit de le remplacer par forkCount qui a des fonctionnalités similaires. Une façon dont vous pourriez utiliser MAVEN_OPTS est ${env.MAVEN_OPTS} mais cela n'est apparemment pas recommandé car cela peut varier d'un ordinateur à l'autre (stackoverflow.com/a/10463133/32453). Notez également que si vous utilisez jacoco, vous devez définir argLine d'une manière différente stackoverflow.com/questions/12269558/maven-jacoco-plugin-error

69voto

user738048 Points 465

Pour ceux qui sont nouveaux à Maven (comme moi), voici toute la configuration qui va dans la section de construction de votre pom. Cheers.

        org.apache.maven.plugins
        maven-surefire-plugin
        2.22.2

            -Xmx1024m

0 votes

Votre solution soulève une JUnitException : TestEngine avec l'ID 'junit-jupiter' n'a pas réussi à découvrir le test lors du démarrage des tests JUnit dans IntelliJ.

13voto

Max Hohenegger Points 793

Pour contourner temporairement ce problème, j'ai trouvé que la manière la plus rapide était la suivante :

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

12voto

Stephen C Points 255558

Il est probable que le problème se trouve dans l'un des tests unitaires que vous avez demandé à Maven d'exécuter.

Par conséquent, jouer avec la taille du tas est la mauvaise approche. Au lieu de cela, vous devriez examiner le test unitaire qui a provoqué le OOME et essayer de déterminer s'il s'agit d'une erreur du test unitaire ou du code qu'il teste.

Commencez par regarder la trace de la pile. S'il n'y en a pas, exécutez à nouveau mvn ... test avec l'option -e.

1 votes

@Stephen, Je peux passer le cas de test dans eclipse après avoir défini -Xmx1024m dans la configuration de lancement, mais cela lance toujours une erreur OutOfMemoryError lorsque je lance "mvn test" dans la console, même lorsque j'ajoute les options -e "mvn test -DMAVEN_OPTS=-Xmx1024m"

3 votes

@zjffdu - Vous avez complètement manqué mon point! Le but d'ajouter "-e" n'est pas de faire fonctionner les tests. C'est pour savoir pourquoi ils ne fonctionnent pas.

0 votes

@Stephen, J'ai ajouté l'option 'e', mais je n'ai pas obtenu suffisamment d'informations utiles.

7voto

Minh Dang Points 11

J'ai résolu ce problème de deux manières de mon côté :

  1. Ajout de cette configuration dans le fichier pom.xml

    -Xmx1024m
  2. Passer à utiliser JDK 1.7 au lieu de 1.6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X