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.