web-dev-qa-db-fra.com

Comment résoudre la "limite de surcharge du GC dépassée" en utilisant maven jvmArg?

Lors de l'exécution d'une classe, j'ai l'exception suivante:

Exception dans le thread "principal" Java.lang.OutOfMemoryError: dépassement de la limite de surcharge du GC

J'ai essayé d'augmenter la taille du tas jvmArg à l'intérieur de maven pom.xml du package de classe:

http://maven.Apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<parent>
    (...)
</parent>


<artifactId>(...)</artifactId>
<name>(...)</name>

<properties>
    <javaOpts.Xmx>4g</javaOpts.Xmx> <!-- default that can be adjusted on the command line with -DjavaOpts.Xmx=... -->
    <(...).basedir>${project.basedir}/..</(...).basedir>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <configuration>
                <launchers>
                    <launcher>
                        <id>MyClassName</id>
                        <mainClass>(...)</mainClass>
                        <jvmArgs>
                            <jvmArg>-Xmx${javaOpts.Xmx}</jvmArg>
                        (...) 

J'ai essayé la dernière ligne citée avec de nombreuses valeurs:

  • <jvmArg>-Xmx512m{javaOpts.Xmx}</jvmArg>
  • <jvmArg>-Xmx4096M{javaOpts.Xmx}</jvmArg>
  • ...
  • <jvmArg>-Xmx10000000000M{javaOpts.Xmx}</jvmArg>

Mais pour tous, j'ai la même erreur.

Est-ce que quelqu'un peut m'aider? Observation: je cours depuis IntelliJ IDEA.

Java 7

Ce n'est pas un problème Maven, vous devez donner plus de mémoire à la machine virtuelle. Vous le faites via variables d'environnement, et le lanceur Maven récupérera automatiquement ces paramètres lors du chargement et les utilisera pour configurer la machine virtuelle sous-jacente Java.

La façon la plus simple de le faire est de:

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled"

Les fenêtres:

set MAVEN_OPTS=-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled

(Pas de guillemets doubles)

Java 8

Java 8 a remplacé la génération permanente par metaspace, et les nouveaux paramètres ressemblent à ceci:

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M -XX:+CMSClassUnloadingEnabled"

42
flavian

J'ai eu un peu le même problème: mon projet wokspace se compose de> 250 modules maven et lors de l'ouverture d'un pom.xml dans IDEA, le <project> et <parent> les balises ont été soulignées en rouge et cette erreur est apparue lors du survol des balises cassées:

Java.lang.OutOfMemoryError: dépassement de la limite de surcharge du GC

Ma solution :

  • définir des valeurs élevées dans >Settings >Build, Execution, Deployment >Build Tools >Maven >Importing - par exemple. -Xmx1g et
  • changer l'implémentation de maven sous >Settings >Build, Execution, Deployment >Build Tools >Maven (Répertoire personnel Maven) de (Bundled) Maven 3 à mon installation Maven locale (pas celle fournie avec IDEA), par exemple à /opt/maven/Apache-maven-3.3.9: Maven Settings Screenshot

Puisque j'ai eu des problèmes avec le maven fourni auparavant, je ne fais tout simplement pas confiance au maven fourni.

6
Alexander

L'ajout de la récupération de place parallèle à la première réponse ci-dessus est probablement la meilleure option:

-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

Dans certains cas, vous pouvez désactiver la limite GC:

-XX:-UseGCOverheadLimit
3
Nami

Désolé pour la réponse très tardive, mais je pense que ma réponse pourrait également aider d'autres personnes.

scala-maven-plugin ne fonctionne pas avec MAVEN_OPTS, la seule façon d'augmenter la mémoire est d'utiliser jvmArgs dans la configuration du plugin. Mais vous devez mettre jvmArgs non pas dans la section du lanceur, mais dans la section de configuration, comme ceci:

<configuration>
    <jvmArgs>
        <jvmArg>-Xmx1024m</jvmArg>
        <jvmArg>-Xms256m</jvmArg>
    </jvmArgs>
</configuration>

Cela fonctionne pour moi.

2
sap1ens

Vous ajoutez jvmArgs à la configuration maven-scala-plugin dans votre pom.xml.

Que voulez-vous dire que vous exécutez depuis IntelliJ IDEA? Comment fais-tu exactement ça? Via leur build/run, vous n'allez pas du tout via Maven! Ensuite, changer les lanceurs maven-scala-plugin dans votre pom.xml est pratiquement inutile. Pour modifier les configurations d'exécution pour IntelliJ, voir cette réponse .

Si vous voulez vraiment exécuter à partir de Maven, après avoir ajouté les paramètres jvmArg au pom.xml, vous devez alors exécuter le plugin:

mvm scala:run -Dlauncher=MyClassName

Remarque: où vous mettez MyClassName, c'est en fait le nom du lanceur, pas la classe. Pour de nombreux projets, les gens choisissent des noms raisonnables pour les lanceurs et cela les fait souvent coïncider avec le nom local des classes. Mais vous pouvez l'appeler MyLauncher si vous le souhaitez.

La lecture des documents de maven-scala-plugin peut vous aider.

0
Pablo Mendes