Définition de l'espace de tas Java sous Maven 2 sous Windows

91

Je reçois ce message lors de la construction de mon projet

java.lang.OutOfMemoryError: espace de tas Java

Comment augmenter l'espace de tas, j'ai 8 Go ou RAM, il est impossible que maven consomme autant, j'ai trouvé ceci http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / comment le faire sous Linux, mais je suis sous Windows 7. Comment puis-je changer l'espace de tas Java sous Windows?

Gandalf StormCrow
la source
Je suppose que vous êtes sur la version 64 bits de Windows? Sinon, vous n'allez pas spécifier plus de 1,5G comme taille de tas, les autres fenêtres de 0,5G que vous pouvez utiliser directement seront requises par la JVM. Il existe une option pour que Windows n'utilise que 1G pour le code du mode noyau et 3G pour le code du mode utilisateur, mais la JVM sun ne vous permettra pas de l'utiliser.
vickirk
@vickirk Je suis sur la version 64 bits de Windows
Gandalf StormCrow
1
Utilisez-vous également une version 64 bits de la JVM? Il sera répertorié sous Windows x64 dans la liste déroulante de la page de téléchargement JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Réponses:

117

La variable d'environnement à définir est MAVEN_OPTS, par exemple MAVEN_OPTS=-Xmx1024m. La maxmemconfiguration dans le pom ne s'applique que lorsque vous définissez le plug-in du compilateur pour javaccréer une nouvelle machine virtuelle Java. Sinon, le plugin s'exécute dans la même VM que Maven et donc dans la mémoire passée en ligne de commande via le MAVEN_OPTS.

Pour définir MAVEN_OPTS sous Windows 7:

  1. Faites un clic droit sur Poste de travail et sélectionnez Propriétés (raccourci clavier appuyez sur Windows+ Pause/Break)
  2. Cliquez sur le lien Paramètres système avancés situé dans la navigation de gauche des propriétés système pour afficher les propriétés système avancées
  3. Accédez à l' onglet Avancé et cliquez sur le bouton Variables d'environnement situé en bas de la fenêtre de configuration Advanced System Properties
  4. Créez une nouvelle variable utilisateur, définissez le nom de la variable sur MAVEN_OPTS et définissez la valeur de la variable sur -Xmx1024m(ou plus)

Ouvrez une nouvelle fenêtre de commande et exécutez mvn.

Pascal Thivent
la source
1
Cela a-t-il un impact sur la vitesse de ma construction? Y a-t-il un conseil pour booster ma build maven en lui allouant plus de mémoire?
Mahendran
45

Si vous manquez d'espace de tas pendant l'exécution de test JUnit infaillible (ou de sécurité intégrée), la modification de MAVEN_OPTS peut ne pas vous aider. J'ai continué à essayer différentes configurations dans MAVEN_OPTS sans succès jusqu'à ce que je trouve ce message qui corrige le problème.

Fondamentalement, les JUnits se retrouvent dans leur propre environnement et ignorent les paramètres de MAVEN_OPTS. Vous devez configurer surefire dans votre pom pour ajouter plus de mémoire pour les JUnits.

J'espère que cela peut faire gagner du temps à quelqu'un d'autre!


Edit: Copier la solution du blog de Keith Chapman juste au cas où le lien se romprait un jour:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

Mise à jour (31/05/2017): Merci à @johnstosh pour l'avoir signalé - le surefire a un peu évolué depuis que j'ai publié cette réponse. Voici un lien vers leur documentation et un exemple de code mis à jour (la ligne arg est toujours la partie importante pour cette question):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>
Chapiteau
la source
Cela m'a fait gagner du temps! Merci! Malheureusement, je ne peux voter qu'une seule fois! :)
javanna
C'est la réponse la plus utile entre les autres, dans le vrai style maven. Merci!
Andremoniy
Ceci est la réponse réelle à la question
Jonathan Landrum
1
Consultez la documentation sur infaillible. les versions surefire antérieures à la 2.14 utilisaient le paramètre forkMode pour configurer le forking. Bien que ce paramètre soit toujours pris en charge pour la compatibilité descendante, les utilisateurs sont vivement encouragés à migrer leur configuration et à utiliser à la place forkCount et reuseForks.
johnstosh
21

Ce devrait être la même commande, sauf SET au lieu de EXPORT

  • set MAVEN_OPTS = -Xmx512m lui donnerait 512 Mo de tas
  • set MAVEN_OPTS = -Xmx2048m lui donnerait 2 Go de tas
corsiKa
la source
Je suis d'accord pour dire que ce devrait être la même commande, mais cela n'en fait pas une vraie déclaration, voici pourquoiC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow
glowcoder est légèrement faux. Vous n'avez pas besoin d'exporter les variables, mais pour leur attribuer une valeur, vous devez les définir.
JeremyP
Vous pouvez également définir MAVEN_OPTS comme variable d'environnement Windows si vous souhaitez utiliser les mêmes valeurs pour chaque build.
digitaljoel
@Gandalf vous devez mettre l'ensemble devant lui @Jeremy oui, c'est pourquoi il est dit d'utiliser set au lieu d'exporter
corsiKa
9

Sur Mac: au lieu de JAVA_OPTSet MAVEN_OPTS, utilisez plutôt _JAVA_OPTIONS. Cela marche!

Steve
la source
cela fonctionne également sur Windows. Ajoutez ceci en tant que variable d'environnement dans la configuration d'exécution de maven dans eclipse, les tests exécutés à partir de m2e ne donnent plus d'erreur
PermGen
3

Après avoir essayé d'utiliser la variable MAVEN_OPTS sans succès, je suis tombé sur ce site qui a fonctionné pour moi. Donc, tout ce que j'avais à faire était d'ajouter -Xms128m -Xmx1024m aux options par défaut de la VM et cela fonctionnait.

Pour les modifier dans Eclipse, accédez à Fenêtre -> Préférences -> Java -> JRE installés. Sélectionnez le JRE / JDK vérifié et cliquez sur Modifier.

kent_e
la source
0

Sur Windows:

Ajoutez une variable d'environnement (dans les variables système et utilisateur, j'ai un problème étrange, qu'il récupère la variable de divers endroits, donc je les ajoute dans les deux).

Nommez-le MAVEN_OPTS.

La valeur sera: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Les nombres peuvent être différents, faites-les par rapport à la taille de votre mémoire.

J'ai eu ce problème et cela l'a résolu, rien d'autre!

Hrabie
la source
0

Cela a fonctionné - Pour changer dans Eclipse, allez dans Fenêtre -> Préférences -> Java -> JRE installés. Sélectionnez le JRE / JDK vérifié et cliquez sur Modifier.

Arguments VM par défaut = -Xms128m -Xmx1024m

Anadi Kumar
la source
-7

Vous recherchez 2 options pour java:

  • -Taille maximale du tas Xmx
  • -Xms taille du tas de départ

Placez-les dans votre appel en ligne de commande de l' javaexécutable, comme ceci:

java -Xms512M -Xmx1024M my.package.MainClass

Gardez à l'esprit que vous souhaiterez peut-être que les tailles de segment de départ et maximale soient identiques, en fonction de l'application, car cela évite de redimensionner le tas pendant l'exécution (ce qui peut prendre du temps dans les applications qui doivent être réactives). Le redimensionnement du tas peut impliquer de déplacer de nombreux objets et de refaire la comptabilité.

Pour les projets de tous les jours, faites-en ce que vous pensez être assez bon. Profil pour obtenir de l'aide.

Phil
la source
1
comme le déclare ebelisle, cette option ne fonctionnerait pas du tout car vous, en utilisant Maven, devez spécifier au moins que c'est une option Maven avec "-D" mais ce n'est toujours pas une commande java de quoi nous parlons
frandevel