97 votes

Échec de la construction de Maven en dehors de la mémoire

À partir d'aujourd'hui, ma compilation maven échoue.

[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO]  at java.lang.String.<init>(String.java:203)
[INFO]  at java.lang.String.substring(String.java:1877)

[ERROR] Mémoire insuffisante ; pour augmenter la quantité de mémoire, utilisez l'indicateur -Xmx au démarrage (java -Xmx128M ...)

Depuis hier, j'ai réussi à lancer une compilation maven.

A partir d'aujourd'hui, je viens de faire passer mon tas à 3 GO . De plus, je n'ai modifié que 2 ou 3 lignes de code mineures, et je ne comprends donc pas cette erreur "out of memory".

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m

EDIT : J'ai essayé le commentaire du poster en changeant le pom.xml de mon module en échec. Mais j'ai eu la même erreur de construction maven.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
            <fork>true</fork>
            <meminitial>1024m</meminitial>
            <maxmem>2024m</maxmem>
       </configuration>
    </plugin>

1 votes

Pourriez-vous fournir plus de traces de la pile ? Je suis curieux de voir ce qui peut causer une initialisation de String à manquer de mémoire. Définir la taille du tas dans MAVEN_OPTS semble être la solution, mais je pense qu'il y a quelque part une chaîne de caractères ridiculement grande pour laquelle vous n'allouez pas assez de mémoire. -Xmx .

147voto

vach Points 581

De quel type de module "web" parlez-vous ? S'agit-il d'une guerre simple et d'une guerre de type packaging ?

Si vous n'utilisez pas le Google's web toolkit (GWT), vous n'avez pas besoin de fournir d'informations sur l'utilisation de l'outil. gwt.extraJvmArgs

La bifurcation du processus de compilation n'est peut-être pas la meilleure idée, car elle démarre un deuxième processus qui ignore MAVEN_OPTS tout à fait, ce qui rend l'analyse plus difficile.

J'essaierais donc d'augmenter le Xmx en réglant le paramètre MAVEN_OPTS.

export MAVEN_OPTS="-Xmx3000m"

Et ne transférez pas le compilateur vers un autre processus.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>

Augmentation de -XX:MaxPermSize=512m ne devrait pas être nécessaire car si la taille des perm est la raison du problème, alors je m'attendrais à l'erreur java.lang.OutOfMemoryError: PermGen space

Si cela ne résout pas votre problème, vous pouvez alors créer des vidages de tas pour une analyse plus approfondie en ajoutant -XX:+HeapDumpOnOutOfMemoryError . De plus, vous pouvez utiliser jconsole.exe dans votre répertoire java bin pour vous connecter au jvm pendant que la compilation est en cours et voir ce qui se passe dans le tas du jvm.

Une autre idée (peut-être stupide) qui m'est venue à l'esprit, avez-vous assez de RAM dans votre machine ? Définir la taille de la mémoire est bien, mais si votre hôte n'a que 4GB et bien vous pourriez avoir le problème que Java n'est pas capable d'utiliser la mémoire définie parce qu'elle est déjà utilisée par l'OS, Java, MS-Office...

0 votes

Merci pour votre réponse. Votre suggestion de supprimer la JVM bifurquée s'applique-t-elle également au "maven-surefire-plugin" ? J'ai essayé votre suggestion de faire passer ma mémoire MAVEN_OPTS à 3000. Mon compilateur maven n'avait pas de paramètre pour une JVM forked, je n'ai donc pas eu besoin de modifier quoi que ce soit. Et oui, ma VM invitée dispose de 4 Go de RAM. La machine hôte a 8 Go de RAM.

2 votes

Au fait, la construction de mvn a encore échoué avec vos suggestions.

1 votes

En général, j'essaie d'éviter la bifurcation de processus tant que je ne l'ai pas fait fonctionner. Si votre système n'a que 4 Go, environ 1 Go est utilisé par le système d'exploitation. Il vous reste donc 3 Go. Si maven démarre avec Xms=1GB alors le reste de la mémoire libre est de 2GB. Ensuite, la bifurcation du compilateur démarre avec Xms=1GB .... ce qui réduit la mémoire libre à 1GB. Maintenant, vous pouvez soustraire la mémoire PermGen 128MB, le processus failsafe-plugin bifurqué, ... Comme vous pouvez le constater, votre paramètre Xmx ne pourra probablement jamais être utilisé par la JVM puisque la mémoire n'est tout simplement pas libre. Avez-vous essayé d'utiliser JConsole ? et HeapDumpOnOutOfMemoryError ?

44voto

A. Di Matteo Points 6655

Répondre tardivement pour mentionner une autre option plutôt que la commune MAVEN_OPTS pour transmettre à la compilation Maven les options JVM requises.

Depuis Maven 3.3.1 vous pourriez avoir un .mvn dans le cadre du projet concerné et un jvm.config Le dossier est l'endroit idéal pour une telle option.

deux nouveaux fichiers de configuration facultatifs .mvn/jvm.config y .mvn/maven.config situé dans le répertoire de base de l'arbre source du projet. S'ils sont présents, ces fichiers fourniront les options par défaut de jvm et de maven. Comme ces fichiers font partie de l'arborescence des sources du projet, ils seront présents dans toutes les vérifications du projet et seront automatiquement utilisés chaque fois que le projet sera construit.

Dans le cadre du programme officiel notes de mise à jour

Dans Maven, il n'est pas simple de définir la configuration de la JVM sur une base par projet. Le mécanisme existant basé sur une variable d'environnement MAVEN_OPTS et l'utilisation de ${user.home}/.mavenrc est une autre option qui présente l'inconvénient de ne pas faire partie du projet.

À partir de cette version, vous pouvez définir la configuration de la JVM via ${maven.projectBasedir}/.mvn/jvm.config ce qui signifie que vous pouvez définir les options pour votre construction sur une base par projet. Ce fichier fera partie de votre projet et sera archivé en même temps que votre projet. Il n'y a donc plus besoin de MAVEN_OPTS , .mavenrc fichiers. Ainsi, par exemple, si vous placez les options JVM suivantes dans le fichier ${maven.projectBasedir}/.mvn/jvm.config fichier :

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

Le principal avantage de cette approche est que la configuration est isolée du projet concerné et appliquée à l'ensemble de la compilation, et qu'elle est moins fragile que l'approche du MAVEN_OPTS pour les autres développeurs travaillant sur le même projet (en oubliant de le paramétrer).
De plus, les options seront appliquées à tous les modules dans le cas d'un projet multi-modules.

16voto

erm3nda Points 462

J'ai eu le même problème en essayant de compiler "clean install" en utilisant un VPS Lowend 512Mb ram et un bon CPU. Exécuter OutOfMemory et tué script à plusieurs reprises.

J'ai utilisé export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m" et a travaillé.

J'obtiens encore d'autres échecs de compilation parce que c'est la première fois que j'utilise Maven, mais le problème OutOfMemory a disparu.

14voto

Ilya Points 12449

Ajouter une option

-XX:MaxPermSize=512m

à MAVEN_OPTS

maven-compiler-plugin options

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <fork>true</fork>
      <meminitial>1024m</meminitial>
      <maxmem>2024m</maxmem>
    </configuration>
  </plugin>

2 votes

J'ai effectivement ajouté l'option -XX:MaxPermSize=1024m, après avoir écrit ce message. Mais j'ai toujours une erreur de mémoire insuffisante. Un autre post de SO a mentionné que je devais ajouter une option à l'argLine de maven-surefire-plugin pour augmenter la mémoire utilisée par les threads fork. Je l'ai augmenté à <argLine>-Xms256m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m</argLine>.

0 votes

J'aurais dû le mentionner... Non, la construction maven a toujours échoué.

0 votes

Ajoutez toutes ces propriétés à maven-compilier-plugin et augmenter -XX:MaxPermSize , Xmx devrait être = XX:MaxPermSize

6voto

hahakubile Points 221

J'ai eu le même problème en compilant Druid.io, augmenter la MaxDirectMemorySize a finalement fonctionné.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

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