web-dev-qa-db-fra.com

Échec de la construction de mémoire insuffisante

À ce jour, 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 insuffisante; pour augmenter la quantité de mémoire, utilisez -Xmx flag au démarrage (Java -Xmx128M ...)

Depuis hier, j'ai réussi à exécuter une compilation Maven. 

À partir d’aujourd’hui, je viens d’augmenter mon tas à 3 Go . De plus, j'ai seulement changé 2 ou 3 lignes de code mineures, donc je ne comprends pas cette erreur de mémoire insuffisante.

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

EDIT: J'ai essayé le commentaire de l'affiche en modifiant le fichier pom.xml de mon module défaillant. Mais j'ai 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>
72
Kevin Meredith

De quel type de module 'Web' parlez-vous? S'agit-il d'une guerre simple avec une guerre de type packaging? 

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

Mettre en place le processus de compilation n'est peut-être pas la meilleure idée, car vous démarrez un deuxième processus qui ignore totalement MAVEN_OPTS et rend l'analyse plus difficile.

Je voudrais donc essayer d'augmenter le Xmx en définissant le MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

Et n'emballez pas le compilateur vers 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>

L'augmentation de -XX:MaxPermSize=512m ne devrait pas être nécessaire, car si la raison du problème est permanente, 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 segments de mémoire pour une analyse ultérieure en ajoutant -XX:+HeapDumpOnOutOfMemoryError. De plus, vous pouvez utiliser jconsole.exe dans votre répertoire bin Java pour vous connecter au jvm pendant l'exécution de la compilation et voir ce qui se passe dans le tas de jvm.

Une autre idée (peut-être stupide) qui m'est venue: avez-vous assez RAM dans votre machine? Définir la taille de la mémoire est facile, mais si votre hôte ne dispose que de 4 Go, le problème est que Java n’est pas en mesure d’utiliser la mémoire définie car elle est déjà utilisée par le système d’exploitation, Java, MS-Office ....

111
vach

Répondez tard pour mentionner encore une autre option plutôt que la variable commune MAVEN_OPTS environment à transmettre au Maven pour générer 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 emplacement idéal pour une telle option.

deux nouveaux fichiers de configuration facultatifs .mvn/jvm.config et .mvn/maven.config, situés dans le répertoire de base de l’arborescence des sources du projet. Si présents, ces fichiers fourniront 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 extractions de projet et seront automatiquement utilisés à chaque génération du projet.

En tant que partie officielle notes de publication

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 machine virtuelle Java via le fichier ${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é avec votre projet. Donc, plus besoin de fichiers MAVEN_OPTS, .mavenrc. Ainsi, par exemple, si vous placez 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 également appliquée à l’ensemble de la construction, et moins fragile que MAVEN_OPTS pour les autres développeurs travaillant sur le même projet (en l’ignorant).
De plus, les options s’appliqueront à tous les modules dans le cas d’un projet multi-module.

25
A_Di-Matteo

J'ai eu le même problème en essayant de compiler une "installation propre" en utilisant un VPS RAM 512 Mo Lowend et un bon processeur. Exécuter OutOfMemory et script tué à plusieurs reprises.

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

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

12
erm3nda

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

Quel type de système d'exploitation utilisez-vous? 

Pour affecter plus de 2 Go de RAM, il faut 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 dispose d'une RAM illimitée, mais que cette dernière est fragmentée de manière à ne pas disposer d'un seul bloc libre de 2 Go, vous obtiendrez également des exceptions de mémoire insuffisante. Et gardez à l'esprit que la mémoire Heap normale n'est qu'une partie de la mémoire utilisée par le processus VM. Donc, sur un ordinateur 32 bits, vous ne pourrez probablement jamais régler Xmx sur 2048 Mo.

Je suggérerais également de définir min et max memory sur la même valeur, car dans ce cas dès que le VM manque de mémoire, le premier temps de 1 Go est alloué dès le début, le VM alloue ensuite un nouveau bloc (en supposant qu'il augmente avec des blocs de 500 Mo) de 1,5 Go après l'attribution, il copie tout le contenu du bloc un dans le nouveau et libère de la mémoire par la suite. S'il manque à nouveau de mémoire, les 2 Go sont alloués et les 1,5 Go sont ensuite copiés, allouant temporairement 3,5 Go de mémoire.

3
Christofer Dutz

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

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
2
hahakubile
_Java_OPTIONS="-Xmx3G" mvn clean install
1
DeviceManager

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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
0
ÖMER TAŞCI

L'utilisation de .mvn/jvm.config a fonctionné pour moi et présente l'avantage supplémentaire d'être liée au projet.

0
colinbes

Cela se produit dans les gros projets sous Windows lorsque cygwin ou un autre émulateur Linux est utilisé (git bash). Par coïncidence, les deux ne fonctionnent pas sur mon projet, qui est un gros projet open source. Dans un script sh, quelques commandes mvn sont appelées. La taille de la mémoire augmente en fonction de la taille de tas spécifiée dans Xmx et la plupart du temps, dans le cas où un deuxième processus Windows est démarré. Cela augmente encore la consommation de mémoire.

Dans ce cas, la solution consiste à utiliser un fichier de commandes et une taille Xmx réduite, puis les opérations maven sont réussies. S'il y a un intérêt, je peux révéler plus de détails.

0
zhrist

Quelqu'un a déjà mentionné le problème avec le système d'exploitation 32 bits. Dans mon cas, le problème était que je compilais avec JDK 32 bits.

0
user2046211

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