Errore di compilazione memoria insufficiente di Maven


88

Ad oggi, la mia compilazione Maven fallisce.

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

[ERRORE] Memoria esaurita; per aumentare la quantità di memoria, utilizzare il flag -Xmx all'avvio (java -Xmx128M ...)

Fino a ieri avevo eseguito con successo una compilazione Maven.

Ad oggi, ho appena aumentato il mio mucchio a 3 GB . Inoltre, ho modificato solo 2-3 righe di codice minori, quindi non capisco questo errore di "memoria esaurita".

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

EDIT: ho provato il commento del poster cambiando pom.xml del mio modulo fallito. Ma ho ricevuto lo stesso errore di build di 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
Potreste fornire più stacktrace? Sono curioso di vedere cosa potrebbe causare l'esaurimento della memoria di un'inizializzazione String. L'impostazione della dimensione dell'heap in MAVEN_OPTS sembra la strada da percorrere, ma la mia ipotesi è che da qualche parte ci sia una stringa ridicolmente grande per la quale potresti non allocare abbastanza -Xmx.
Edward Samson,

Risposte:


136

Di che tipo di modulo 'web' stai parlando? È una guerra semplice e ha una guerra del tipo di imballaggio?

Se non utilizzi il web toolkit (GWT) di Google, non è necessario fornirne gwt.extraJvmArgs

Il fork del processo di compilazione potrebbe non essere l'idea migliore, perché avvia un secondo processo che ignora del MAVEN_OPTStutto, rendendo così più difficile l'analisi.

Quindi proverei ad aumentare Xmx impostando MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

E non eseguire il fork del compilatore su un processo diverso

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

L'aumento -XX:MaxPermSize=512mnon dovrebbe essere richiesto perché se la dimensione della perm è la ragione del problema, allora mi aspetto l'errorejava.lang.OutOfMemoryError: PermGen space

Se questo non risolve il tuo problema, puoi creare dump di heap per ulteriori analisi aggiungendo -XX:+HeapDumpOnOutOfMemoryError. Inoltre, puoi usare jconsole.exe nella tua directory bin java per connetterti a jvm mentre la compilazione è in esecuzione e vedere cosa sta succedendo all'interno dell'heap di jvm.

Un'altra idea (potrebbe essere stupida) che mi è venuta in mente, hai abbastanza RAM nella tua macchina? Definire la dimensione della memoria è carino, ma se il tuo host ha solo 4 GB e quindi potresti avere il problema che Java non è in grado di utilizzare la memoria definita perché è già utilizzata dal sistema operativo, Java, MS-Office ...


grazie per la tua risposta. Il tuo suggerimento di rimuovere la JVM biforcuta vale anche per il "plug-in maven-surefire?" Ho provato il tuo suggerimento per aumentare la mia memoria MAVEN_OPTS a 3000. Il mio compilatore Maven non aveva un'impostazione per una JVM biforcuta, quindi non avevo bisogno di cambiare nulla lì. E sì, la mia VM Ospite ha 4 GB di RAM. La macchina host dispone di 8 GB di RAM.
Kevin Meredith

2
a proposito, la build di mvn non è riuscita di nuovo con i tuoi suggerimenti.
Kevin Meredith

1
Di solito cerco di evitare il fork del processo finché non lo faccio funzionare. Se il tuo sistema ha solo 4 GB, ~ 1 GB viene utilizzato dal sistema operativo. Quindi hai 3 GB di riposo. Se Maven inizia con Xms = 1 GB, il resto della memoria libera è di 2 GB. Successivamente il fork del compilatore è iniziato con Xms = 1 GB .... che riduce la memoria libera a 1 GB. Ora puoi sottrarre PermGen Memory 128MB, il processo di plug-in fail-safe biforcuto, ... Come puoi vedere la tua impostazione Xmx molto probabilmente non potrebbe mai essere usata come JVM poiché la memoria è semplice, non libera. Hai provato a utilizzare JConsole? e HeapDumpOnOutOfMemoryError?
vach

Ho rimosso Xms1024m dal mio MAVEN_OPTS, ma la build mvn non è riuscita ancora. Ho aggiunto "HeapDump ..." al mio MAVEN_OPTS, ma non sono sicuro di dove verrà stampato il dump. Sto esaminando JConsole ora.
Kevin Meredith

I dump sono nella directory
jvms

36

Rispondere in ritardo per menzionare ancora un'altra opzione piuttosto che la MAVEN_OPTSvariabile di ambiente comune per passare alla build Maven le opzioni JVM richieste.

A partire da Maven 3.3.1 , potresti avere una .mvncartella come parte del progetto in questione e un jvm.configfile come luogo perfetto per tale opzione.

due nuovi file di configurazione opzionali .mvn/jvm.confige .mvn/maven.config, situati nella directory di base dell'albero dei sorgenti del progetto. Se presenti, questi file forniranno le opzioni jvm e maven predefinite. Poiché questi file fanno parte dell'albero sorgente del progetto, saranno presenti in tutti i checkout del progetto e verranno utilizzati automaticamente ogni volta che il progetto viene compilato.

Come parte delle note di rilascio ufficiali

In Maven non è semplice definire la configurazione JVM sulla base del progetto. Il meccanismo esistente basato su una variabile d'ambiente MAVEN_OPTSe l'utilizzo di ${user.home}/.mavenrcè un'altra opzione con l'inconveniente di non far parte del progetto.

A partire da questa versione è possibile definire la configurazione JVM tramite ${maven.projectBasedir}/.mvn/jvm.configfile, il che significa che è possibile definire le opzioni per la propria build sulla base del progetto. Questo file diventerà parte del tuo progetto e verrà archiviato insieme al tuo progetto. Quindi nessun bisogno di più per MAVEN_OPTS, .mavenrci file. Quindi, ad esempio, se inserisci le seguenti opzioni JVM nel ${maven.projectBasedir}/.mvn/jvm.configfile:

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

Il vantaggio principale di questo approccio è che la configurazione è isolata rispetto al progetto in questione e applicata anche all'intera build, e meno fragile rispetto MAVEN_OPTSad altri sviluppatori che lavorano sullo stesso progetto (dimenticandosi di impostarlo).
Inoltre, le opzioni verranno applicate a tutti i moduli in caso di progetto multi-modulo.


2
Nota che MaxPermSize viene ignorato se stai usando JDK 8.
GeraldScott

14

Ho avuto lo stesso problema cercando di compilare "installazione pulita" utilizzando un VPS di RAM da 512 Mb di fascia bassa e una buona CPU. Esegui OutOfMemory e ucciso ripetutamente lo script.

Ho usato export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"e lavorato.

Ho ancora qualche altro errore di compilazione perché è la prima volta che ho bisogno di Maven, ma il problema di OutOfMemory è scomparso.


11

Aggiungi opzione

-XX:MaxPermSize=512m

a MAVEN_OPTS

maven-compiler-plugin opzioni

  <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
In realtà ho aggiunto l'opzione -XX: MaxPermSize = 1024m, dopo aver creato questo post. Ma ho ancora un errore di memoria insufficiente. Un altro post SO ha menzionato che devo aggiungere un'opzione all'argLine di maven-surefire-plugin per aumentare la memoria utilizzata dai thread biforcuti. L'ho aumentato a <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith

Avrei dovuto dirlo ... No, la build Maven non è riuscita ancora.
Kevin Meredith

Aggiungi tutte queste proprietà maven-compilier-plugine aumenta -XX:MaxPermSize, Xmxdovrebbe essere =XX:MaxPermSize
Ilya

Utilizza anche l'opzione <fork> true </true> inmaven-compilier-plugin
Ilya

L'ho provato (vedere il post originale), ma la mia build mvn non è riuscita ancora.
Kevin Meredith,

4

Ho avuto lo stesso problema durante la compilazione di Druid.io, aumentando MaxDirectMemorySize alla fine ha funzionato.

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

Curioso, MaxDirectMemorySize è apparentemente illimitato per impostazione predefinita (cioè hai aggiunto un limite, non modificato uno preesistente).
Tomer Gabel

4

Questa configurazione di seguito funziona nel mio caso

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

Prova a utilizzare -XX: MaxPermSize invece di -XX: MaxPermGen



3

Che tipo di sistema operativo stai utilizzando?

Per assegnare più di 2 GB di RAM deve essere almeno un sistema operativo a 64 bit.

Poi c'è un altro problema. Anche se il tuo sistema operativo ha RAM illimitata, ma è frammentata in modo tale che non sia disponibile un singolo blocco libero di 2 GB, uscirai anche dalle eccezioni di memoria. E tieni presente che la normale memoria Heap è solo una parte della memoria utilizzata dal processo VM. Quindi su una macchina a 32 bit probabilmente non sarai mai in grado di impostare Xmx su 2048 MB.

Suggerirei anche di impostare min e max memory allo stesso valore, perché in questo caso non appena la VM esaurisce la memoria il primo tempo 1 GB viene allocato dall'inizio, la VM alloca quindi un nuovo blocco (supponendo che aumenti con Blocchi da 500 MB) di 1,5 GB dopo che è stato allocato, copierà tutte le cose dal blocco uno a quello nuovo e libererà la memoria dopo. Se si esaurisce nuovamente la memoria, vengono allocati 2 GB e 1,5 GB vengono quindi copiati, allocando temporaneamente 3,5 GB di memoria.


1

Durante la creazione del progetto su piattaforma Unix / Linux, impostare la sintassi delle opzioni Maven come di seguito. Si noti che i segni di qoutazione singola, non la doppia qoutation.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

0

L'uso di .mvn / jvm.config ha funzionato per me, inoltre ha l'ulteriore vantaggio di essere collegato al progetto.


0

Questo accade in grandi progetti su Windows quando viene utilizzato cygwin o un altro emulatore di linux (git bash). Per qualche coincidenza, entrambi non funzionano sul mio progetto, che è un grande progetto open source. In uno script sh, vengono chiamati un paio di comandi mvn. La dimensione della memoria aumenta fino alla dimensione dell'heap maggiore di quella specificata in Xmx e la maggior parte delle volte in un caso viene avviato un secondo processo di Windows. Ciò sta aumentando ulteriormente il consumo di memoria.

La soluzione in questo caso è usare file batch e dimensioni Xmx ridotte e quindi le operazioni di maven hanno successo. Se c'è interesse posso rivelare maggiori dettagli.


0

Qualcuno ha già menzionato il problema con il sistema operativo a 32 bit. Nel mio caso il problema era che stavo compilando con JDK a 32 bit.


0

L'aumento della dimensione della memoria nella variabile di ambiente "MAVEN_OPTS" aiuterà a risolvere questo problema. Per me, l'aumento da -Xmx756M a -Xmx1024M ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.