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>
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 ... .
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 deMAVEN_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.
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.
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>
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.
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"
Utilisation .mvn / jvm.config a fonctionné pour moi plus a l'avantage d'être lié au projet.
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
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'