Festlegen des Java-Heapspeichers unter Maven 2 unter Windows


91

Ich erhalte diese Nachricht während der Erstellung meines Projekts

java.lang.OutOfMemoryError: Java-Heapspeicher

Wie kann ich den Heap-Speicherplatz erhöhen? Ich habe 8 GB oder RAM. Es ist unmöglich, dass Maven so viel verbraucht. Ich fand dies http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-Heap-Speicher-für-Maven-2-unter-Linux / Wie geht das unter Linux, aber ich bin unter Windows 7. Wie kann ich den Java-Heap-Speicherplatz unter Windows ändern?


Ich nehme an, Sie sind auf 64-Bit-Version von Windows? Wenn nicht, geben Sie nicht mehr als 1,5 G als Heap-Größe an. Die anderen 0,5 G-Fenster, die Sie direkt verwenden können, werden von der JVM benötigt. Es gibt eine Option, mit der Windows nur 1G für den Kernal-Modus-Code und 3G für den Benutzermodus-Code verwendet, aber die Sun-JVM erlaubt Ihnen nicht, ihn zu verwenden.
Vickirk

@ Vickirk Ich bin auf 64-Bit-Version von Windows
Gandalf StormCrow

1
Verwenden Sie auch eine 64-Bit-Version der JVM? Es wird als Windows - x64 in der Dropdown - Liste auf der JDK Download - Seite aufgeführt: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Antworten:


117

Die einzustellende Umgebungsvariable ist MAVEN_OPTSbeispielsweise MAVEN_OPTS=-Xmx1024m. Die maxmemKonfiguration im POM gilt nur, wenn Sie das Compiler-Plugin so einstellen, dass es sich javacin eine neue JVM einfügt. Andernfalls wird das Plugin in derselben VM wie Maven und damit in dem über die Befehlszeile über das übergebenen Speicher ausgeführt MAVEN_OPTS.

So legen Sie MAVEN_OPTS unter Windows 7 fest:

  1. Klicken Sie mit der rechten Maustaste auf Arbeitsplatz und wählen Sie Eigenschaften (Tastenkombination drücken Sie Windows+ Pause/Break).
  2. Klicken Sie auf den Link Erweiterte Systemeinstellungen in der linken Navigation der Systemeigenschaften, um die erweiterten Systemeigenschaften anzuzeigen
  3. Gehen Sie zur Registerkarte Erweitert und klicken Sie auf die Schaltfläche Umgebungsvariablen unten im Konfigurationsfenster Erweiterte Systemeigenschaften
  4. Erstellen Sie eine neue Benutzervariable, setzen Sie den Variablennamen auf MAVEN_OPTS und setzen Sie den Variablenwert auf -Xmx1024m(oder mehr).

Öffnen Sie ein neues Befehlsfenster und führen Sie es aus mvn.


1
Hat dies einen Einfluss auf die Geschwindigkeit meines Builds? Gibt es einen Tipp, um meinen Maven-Build zu verbessern und ihm mehr Speicher zuzuweisen?
Mahendran

45

Wenn Ihnen während des todsicheren (oder ausfallsicheren) JUnit-Testlaufs der Heap-Speicherplatz ausgeht, hilft Ihnen das Ändern von MAVEN_OPTS möglicherweise nicht weiter. Ich habe immer wieder verschiedene Konfigurationen in MAVEN_OPTS ausprobiert, ohne Glück, bis ich diesen Beitrag gefunden habe , der das Problem behoben hat.

Grundsätzlich verzweigen sich die JUnits in ihre eigene Umgebung und ignorieren die Einstellungen in MAVEN_OPTS. Sie müssen todsichere Daten in Ihrem POM konfigurieren, um mehr Speicher für die JUnits hinzuzufügen.

Hoffentlich kann dies jemand anderem Zeit sparen!


Bearbeiten: Kopieren der Lösung aus Keith Chapmans Blog für den Fall, dass der Link eines Tages unterbrochen wird:

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

Update (31.05.2017): Vielen Dank an @johnstosh für diesen Hinweis - das todsichere hat sich ein wenig weiterentwickelt, seit ich diese Antwort veröffentlicht habe. Hier ist ein Link zu ihrer Dokumentation und ein aktualisiertes Codebeispiel (arg line ist immer noch der wichtige Teil für diese Frage):

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

Es hat mir etwas Zeit gespart! Vielen Dank! Leider kann ich nur einmal upvoten! :)
Javanna

Dies ist die hilfreichste Antwort zwischen anderen, im echten Maven-Stil. Vielen Dank!
Andremoniy

Dies ist die eigentliche Antwort auf die Frage
Jonathan Landrum

1
Siehe die Dokumente zu todsicheren. Surefire-Versionen vor 2.14 verwendeten den Parameter forkMode, um das Forking zu konfigurieren. Obwohl dieser Parameter aus Gründen der Abwärtskompatibilität weiterhin unterstützt wird, wird Benutzern dringend empfohlen, ihre Konfiguration zu migrieren und stattdessen forkCount und reuseForks zu verwenden.
Johnstosh

21

Es sollte der gleiche Befehl sein, außer SET anstelle von EXPORT

  • Wenn Sie MAVEN_OPTS = -Xmx512m setzen, erhalten Sie 512 MB Heap
  • Wenn Sie MAVEN_OPTS = -Xmx2048m setzen, erhalten Sie 2 GB Heap

Ich bin damit einverstanden, dass es der gleiche Befehl sein sollte, aber das macht es nicht wahr Aussage, hier ist warumC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow

Glowcoder ist etwas falsch. Sie müssen die Variablen nicht EXPORTIEREN, aber um ihnen einen Wert zuzuweisen, müssen Sie einen Wert festlegen.
JeremyP

Sie können MAVEN_OPTS auch als Windows-Umgebungsvariable festlegen, wenn Sie für jeden Build dieselben Werte verwenden möchten.
Digitaljoel

@Gandalf Sie müssen das Set davor stellen @Jeremy ja, deshalb heißt es, Set anstelle von Export zu verwenden
corsiKa

9

Auf dem Mac: Verwenden Sie anstelle von JAVA_OPTSund MAVEN_OPTS_JAVA_OPTIONS. Das funktioniert!


Dies funktioniert auch unter Windows. Fügen Sie dies als Umgebungsvariable in der Maven-Run-Konfiguration in Eclipse hinzu. Tests, die von m2e ausgeführt werden, geben keinen PermGen-Fehler mehr aus
fedeb

3

Nachdem ich ohne Glück versucht hatte, die Variable MAVEN_OPTS zu verwenden, stieß ich auf diese Site, die für mich funktionierte. Alles was ich tun musste war -Xms128m -Xmx1024m zu den Standard-VM-Optionen hinzuzufügen und es funktionierte.

Um diese in Eclipse zu ändern, gehen Sie zu Fenster -> Einstellungen -> Java -> Installierte JREs. Wählen Sie das aktivierte JRE / JDK aus und klicken Sie auf Bearbeiten.


0

Unter Windows:

Fügen Sie eine Umgebungsvariable hinzu (sowohl in System- als auch in Benutzervariablen habe ich ein seltsames Problem, dass die Variable von verschiedenen Stellen abgerufen wird, also füge ich sie in beiden hinzu).

Nennen Sie es MAVEN_OPTS.

Wert wird sein: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Die Zahlen können unterschiedlich sein, machen Sie sie relativ zu Ihrer Memgröße.

Ich hatte dieses Problem und das hat es behoben, sonst nichts!


0

Es hat funktioniert - Um in Eclipse zu ändern, gehen Sie zu Fenster -> Einstellungen -> Java -> Installierte JREs. Wählen Sie das aktivierte JRE / JDK aus und klicken Sie auf Bearbeiten.

Standard-VM-Argumente = -Xms128m -Xmx1024m


-6

Sie suchen nach 2 Optionen für java:

  • -Xmx maximale Heap-Größe
  • -Xms Start-Heap-Größe

Fügen Sie sie javawie folgt in Ihren Befehlszeilenaufruf der ausführbaren Datei ein:

java -Xms512M -Xmx1024M my.package.MainClass

Beachten Sie, dass die Startgröße und die maximale Größe des Heapspeichers je nach Anwendung möglicherweise gleich sein sollen, da dadurch die Größe des Heapspeichers zur Laufzeit nicht geändert werden kann (was in Anwendungen, die reagieren müssen, einige Zeit in Anspruch nehmen kann). Das Ändern der Größe des Heaps kann dazu führen, dass viele Objekte verschoben und die Buchhaltung wiederholt werden.

Machen Sie sie für alltägliche Projekte so, wie Sie es für gut genug halten. Profil für Hilfe.


1
Wie Ebelisle feststellt, würden diese Optionen überhaupt nicht funktionieren, da Sie mit Maven mindestens angeben müssen, dass es sich um eine Maven-Option mit "-D" handelt, aber immer noch kein Java-Befehl ist, von dem wir sprechen
Frandevel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.