Maven hors de L'échec de construction de 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)

[ERREUR] mémoire; pour augmenter la quantité de mémoire, utilisez l'option-Xmx drapeau au démarrage (java-xmx128m ...)

À partir d'hier, j'avais exécuté avec succès une compilation maven.

Aujourd'hui, je viens de tombé mon tas de 3 GO. En outre, j'ai seulement changé 2-3 lignes mineures de code, donc je ne comprends pas cette erreur de mémoire.

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

EDIT: j'ai essayé le commentaire de l'affiche en changeant mon échec module de pom.XML. 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>
66
demandé sur A_Di-Matteo 2012-09-19 20:13:18

9 réponses

De quel type de module ' web ' parlez-vous? Est - ce une guerre simple et a la guerre de type d'emballage?

Si vous n'utilisez pas la boîte à outils Web de Google (GWT), vous n'avez pas besoin d'en offrir gwt.extraJvmArgs

Bifurquer le processus de compilation peut ne pas être la meilleure idée car alors vous démarrez un deuxième processus qui ignore les MAVEN_OPTS et rend l'analyse plus difficile.

Donc, j'essaierais d'augmenter le Xmx en définissant les MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

Et ne fourche pas le compilateur à un processus différent

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

Augmenter -XX:MaxPermSize=512m ne devrait pas être nécessaire car si perm sice 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 créer des vidages de tas pour une analyse plus approfondie en ajoutant -XX:+HeapDumpOnOutOfMemoryError. En outre, vous pouvez utiliser jconsole.exe dans le répertoire bin de java pour vous connecter à la jvm pendant que la compilation est en cours d'exécution et voir ce qui se passe dans le tas de la jvm.

Une autre idée (peut être stupide un) qui est venu à moi, Avez-vous assez de RAM à l'intérieur de votre machine? Définir la taille de la mémoire est bien, mais si votre hôte n'a que 4 Go et que vous pourriez avoir le problème que Java ne peut pas utiliser la mémoire définie car elle est déjà utilisée par le système D'exploitation, Java, MS-Office ... .

98
répondu vach 2012-09-22 12:56:51

Répondre tard pour mentionner encore une autre option plutôt que le commun MAVEN_OPTS variable d'environnement pour passer à la génération Maven les options JVM requises.

Depuis Maven 3.3.1, vous pourriez avoir un dossier .mvn dans le cadre du projet concerné et un fichier jvm.config comme endroit idéal pour une telle option.

Deux nouveaux fichiers de configuration optionnels .mvn/jvm.config et .mvn/maven.config, situés dans le répertoire de base de l'arborescence source du projet. Si l'heure actuelle, ces fichiers fournira les options JVM et Maven par défaut. Étant donné que ces fichiers font partie de l'arborescence des sources du projet, ils seront présents dans toutes les caisses du projet et seront automatiquement utilisés chaque fois que le projet est construit.

Dans le cadre des notes de version officielles

Dans Maven, il n'est pas simple de définir la configuration 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 avec le inconvénient de ne pas faire partie du projet.

À partir de cette version, vous pouvez définir la configuration JVM via le fichier ${maven.projectBasedir}/.mvn/jvm.config, ce qui signifie que vous pouvez définir les options pour votre build sur une base par projet. Ce fichier fera partie de votre projet et sera vérifié avec votre projet. Donc plus besoin de MAVEN_OPTS, .mavenrc fichiers. Ainsi, par exemple, si vous mettez les options JVM suivantes dans le fichier ${maven.projectBasedir}/.mvn/jvm.config:

-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 construction, et moins fragile que MAVEN_OPTS pour les autres développeurs travaillant sur le même projet (oubliant de le définir).
De plus, les options seront appliquées à tous les modules dans le cas d'un projet multi-modules.

23
répondu A_Di-Matteo 2016-03-14 21:50:25

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

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

Toujours avoir un autre échec de compilation parce que c'est la première fois que j'ai besoin de Maven, mais le problème OutOfMemory a disparu.

11
répondu erm3nda 2015-01-19 06:06:22

Ajouter une option

-XX:MaxPermSize=512m

Vers 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>
9
répondu Ilya 2012-09-20 16:27:01

Quel type D'OS utilisez-vous?

Afin d'attribuer plus de 2 Go de ram, il doit être au moins un système d'exploitation 64 bits.

Ensuite, il y a un autre problème. Même si votre système d'exploitation a une RAM illimitée, mais qui est fragmentée de manière à ce qu'aucun bloc libre de 2 Go ne soit disponible,vous obtiendrez également des exceptions de mémoire. Et gardez à l'esprit que la mémoire de tas normale n'est qu'une partie de la mémoire que le processus de machine virtuelle utilise. Donc, sur une machine 32 bits, vous ne pourrez probablement jamais définir Xmx sur 2048.

Je suggère également de définir min une mémoire max à la même valeur, car dans ce cas, dès que la machine virtuelle est à court de mémoire, le premier temps 1GB est alloué dès le début, la machine virtuelle alloue ensuite un nouveau bloc (en supposant qu'il augmente avec des blocs 500MB) de 1,5 GB après cela est alloué, il copierait tous les éléments du bloc un au nouveau et libérerait de la mémoire après cela. S'il manque à nouveau de mémoire, les 2GB sont alloués et les 1,5 GB sont ensuite copiés, en allouant Temporairement 3,5 Go de mémoire.

2
répondu Christofer Dutz 2012-09-28 14:46:15

J'ai eu le même problème lors de la compilation Druid.io, l'augmentation de la MaxDirectMemorySize a finalement fonctionné.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
2
répondu hahakubile 2017-03-02 12:32:03

Utilisation .mvn / jvm.config a fonctionné pour moi plus a l'avantage d'être lié au projet.

0
répondu colinbes 2016-03-23 18:39:20

Cette configuration ci-dessous fonctionne dans mon cas

<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>

Essayez d'utiliser-XX: MaxPermSize au lieu de-XX: MaxPermGen

0
répondu Narayan Yerrabachu 2018-02-11 20:54:48

Lors de la construction du projet sur la plate-forme Unix/Linux, définissez la syntaxe des options Maven comme ci-dessous. Notez que les signes de qoutation unique, pas double qoutation.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
0
répondu ÖMER TAŞCI 2018-07-19 06:18:09