Impostazione dello spazio heap Java in Maven 2 su Windows


91

Ricevo questo messaggio durante la creazione del mio progetto

java.lang.OutOfMemoryError: spazio heap Java

Come faccio ad aumentare lo spazio sull'heap, ho 8 GB o RAM, è impossibile che Maven abbia consumato così tanto, ho trovato questo http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / come si fa su linux, ma sono su Windows 7. Come posso cambiare lo spazio heap java sotto windows?


Presumo che tu sia sulla versione a 64 bit di Windows? In caso contrario, non specificherai più di 1,5 G come dimensione dell'heap, le altre finestre 0,5 G che ti consentono di utilizzare direttamente saranno richieste dalla JVM. C'è un'opzione per far sì che Windows usi solo 1G per il codice della modalità kernel e 3G per il codice della modalità utente, ma la JVM del sole non ti permetterà di usarlo.
vickirk

@vickirk Sono sulla versione a 64 bit di Windows
Gandalf StormCrow

1
Stai utilizzando anche una versione a 64 bit della JVM? Verrà elencato come Windows x64 nell'elenco a discesa nella pagina di download di JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Risposte:


117

La variabile d'ambiente da impostare è MAVEN_OPTS, ad esempio MAVEN_OPTS=-Xmx1024m. La maxmemconfigurazione nel pom si applica solo quando si imposta il plug-in del compilatore per eseguire il fork javacin una nuova JVM. In caso contrario, il plug-in viene eseguito all'interno della stessa VM di Maven e quindi all'interno della memoria passata sulla riga di comando tramite MAVEN_OPTS.

Per impostare MAVEN_OPTS in Windows 7:

  1. Fare clic con il tasto destro su Risorse del computer e selezionare Proprietà (scorciatoia da tastiera premere Windows+ Pause/Break)
  2. Fare clic sul collegamento Impostazioni di sistema avanzate situato nella barra di navigazione a sinistra di Proprietà di sistema per visualizzare le Proprietà di sistema avanzate
  3. Vai alla scheda Avanzate e fai clic sul pulsante Variabili d'ambiente situato nella parte inferiore della finestra di configurazione delle proprietà di sistema avanzate
  4. Crea una nuova variabile utente, imposta il nome della variabile su MAVEN_OPTS e imposta il valore della variabile su -Xmx1024m(o più)

Apri una nuova finestra di comando ed esegui mvn.


1
Questo ha qualche impatto sulla velocità della mia build? C'è qualche suggerimento per potenziare la mia build Maven allocando più memoria ad essa?
Mahendran

45

Se stai esaurendo lo spazio heap durante l'esecuzione del test JUnit infallibile (o fail-safe), la modifica di MAVEN_OPTS potrebbe non aiutarti. Ho continuato a provare diverse configurazioni in MAVEN_OPTS senza fortuna finché non ho trovato questo post che ha risolto il problema.

Fondamentalmente le JUnit si inseriscono nel proprio ambiente e ignorano le impostazioni in MAVEN_OPTS. Devi configurare la sicurezza nel tuo pom per aggiungere più memoria per le JUnits.

Speriamo che questo possa far risparmiare tempo a qualcun altro!


Modifica: copia della soluzione dal blog di Keith Chapman nel caso in cui il collegamento si interrompesse un giorno:

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

Aggiornamento (31/5/2017): Grazie a @johnstosh per averlo sottolineato: la sicurezza si è evoluta un po 'da quando ho pubblicato questa risposta. Ecco un collegamento alla loro documentazione e un esempio di codice aggiornato (la riga arg è ancora la parte importante per questa domanda):

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

Mi ha fatto risparmiare un po 'di tempo! Grazie! Purtroppo posso votare solo una volta! :)
javanna

Questa è la risposta più utile tra gli altri, in vero stile esperto. Grazie!
Andremoniy

Questa è la risposta effettiva alla domanda
Jonathan Landrum

1
Vedi i documenti su infallibile. Le versioni surefire precedenti alla 2.14 utilizzavano il parametro forkMode per configurare il fork. Sebbene tale parametro sia ancora supportato per la compatibilità con le versioni precedenti, gli utenti sono fortemente incoraggiati a migrare la propria configurazione e utilizzare invece forkCount e reuseForks.
johnstosh

21

Dovrebbe essere lo stesso comando, tranne SET invece di EXPORT

  • set MAVEN_OPTS = -Xmx512m gli darebbe 512 Mb di heap
  • set MAVEN_OPTS = -Xmx2048m gli darebbe 2 Gb di heap

Sono d'accordo che dovrebbe essere lo stesso comando, ma questo non lo rende un'affermazione vera, ecco perchéC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow

glowcoder è leggermente sbagliato. Non è necessario ESPORTARE le variabili, ma per assegnare loro un valore è necessario impostarle.
JeremyP

È inoltre possibile impostare MAVEN_OPTS come variabile di ambiente di Windows se si desidera utilizzare gli stessi valori per ogni build.
digitaljoel

@Gandalf devi mettere il set davanti @Jeremy sì, ecco perché dice di usare set invece di export
corsiKa

9

Su Mac: invece di JAVA_OPTSe MAVEN_OPTS, usa _JAVA_OPTIONS invece. Funziona!


funziona anche su Windows. Aggiungilo come variabile d'ambiente nella configurazione di esecuzione di Maven in eclipse, i test eseguiti da m2e non danno più l'errore
PermGen

3

Dopo aver provato a utilizzare la variabile MAVEN_OPTS senza fortuna, mi sono imbattuto in questo sito che ha funzionato per me. Quindi tutto quello che dovevo fare era aggiungere -Xms128m -Xmx1024m alle opzioni VM predefinite e ha funzionato.

Per cambiarli in Eclipse, vai su Finestra -> Preferenze -> Java -> JRE installati. Seleziona il JRE / JDK selezionato e fai clic su Modifica.


0

Su Windows:

Aggiungi una variabile ambientale (sia nelle variabili di sistema che in quelle dell'utente, ho qualche strano problema, che ottiene la var da vari punti, quindi le aggiungo in entrambe).

Chiamalo MAVEN_OPTS.

Il valore sarà: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

I numeri possono essere diversi, rendili relativi alla dimensione del tuo mem.

Ho avuto quel problema e questo lo ha risolto, nient'altro!


0

Ha funzionato - Per cambiare in Eclipse, vai su Finestra -> Preferenze -> Java -> JRE installati. Seleziona il JRE / JDK selezionato e fai clic su Modifica.

Argomenti VM predefiniti = -Xms128m -Xmx1024m


-7

Stai cercando 2 opzioni per java:

  • -Xmx dimensione massima dell'heap
  • -Xms dimensione heap iniziale

Inseriscili nella tua chiamata da riga di comando javadell'eseguibile, in questo modo:

java -Xms512M -Xmx1024M my.package.MainClass

Tieni presente che potresti volere che le dimensioni dell'heap iniziale e massima siano le stesse, a seconda dell'applicazione, poiché evita il ridimensionamento dell'heap durante il runtime (che può richiedere tempo nelle applicazioni che devono essere reattive). Il ridimensionamento dell'heap può comportare lo spostamento di molti oggetti e il ripristino della contabilità.

Per i progetti di tutti i giorni, creali come preferisci. Profilo per aiuto.


1
come afferma ebelisle, questa opzione non funzionerebbe affatto poiché tu, usando Maven, devi specificare almeno che è un'opzione Maven con "-D" ma ancora non è un comando java quello di cui stiamo parlando
frandevel
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.