Maven Out of Memory Build-Fehler

88

Ab heute schlägt meine Maven-Kompilierung fehl.

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

[FEHLER] Nicht genügend Speicher; Verwenden Sie beim Start das Flag -Xmx (Java -Xmx128M ...), um die Speicherkapazität zu erhöhen.

Bis gestern hatte ich erfolgreich eine Maven-Kompilierung ausgeführt.

Bis heute habe ich meinen Heap auf 3 GB erhöht . Außerdem habe ich nur 2-3 kleinere Codezeilen geändert, sodass ich diesen Fehler "Nicht genügend Speicher" nicht verstehe.

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

BEARBEITEN: Ich habe den Kommentar des Posters ausprobiert, indem ich die pom.xml meines ausgefallenen Moduls geändert habe. Aber ich habe den gleichen Maven Build Fehler bekommen.

    <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>
Kevin Meredith
quelle
1
Könnten Sie mehr von der Stapelverfolgung bereitstellen? Ich bin gespannt, was dazu führen kann, dass einer String-Initialisierung der Speicherplatz ausgeht. Das Festlegen der Heap-Größe in MAVEN_OPTS klingt nach dem richtigen Weg, aber ich vermute, dass es irgendwo einen lächerlich großen String gibt, für den Sie möglicherweise nicht genug zuweisen -Xmx.
Edward Samson

Antworten:

136

Über was für ein Webmodul sprechen Sie? Ist es ein einfacher Krieg und hat Verpackungskrieg?

Wenn Sie das Web Toolkit (GWT) von Google nicht verwenden, müssen Sie keine bereitstellen gwt.extraJvmArgs

Das Verzweigen des Kompilierungsprozesses ist möglicherweise nicht die beste Idee, da ein zweiter Prozess gestartet wird, der MAVEN_OPTSinsgesamt ignoriert wird , wodurch die Analyse erschwert wird.

Also würde ich versuchen, den Xmx durch Setzen von MAVEN_OPTS zu erhöhen

export MAVEN_OPTS="-Xmx3000m"

Und verzweigen Sie den Compiler nicht in einen anderen Prozess

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

Eine Erhöhung -XX:MaxPermSize=512msollte nicht erforderlich sein, da ich den Fehler erwarten würde, wenn die Dauerwellengröße der Grund für das Problem istjava.lang.OutOfMemoryError: PermGen space

Wenn dies Ihr Problem nicht löst, können Sie durch Hinzufügen Heap-Dumps zur weiteren Analyse erstellen -XX:+HeapDumpOnOutOfMemoryError. Darüber hinaus können Sie mit jconsole.exe in Ihrem Java-Bin-Verzeichnis eine Verbindung zum JVM herstellen, während die Kompilierung ausgeführt wird, und sehen, was im Heap des JVM vor sich geht.

Eine andere Idee (kann eine dumme sein), die mir einfiel: Haben Sie genug RAM in Ihrem Computer? Das Definieren der Speichergröße ist hilfreich, aber wenn Ihr Host nur 4 GB hat und Sie möglicherweise das Problem haben, dass Java den definierten Speicher nicht verwenden kann, da er bereits vom Betriebssystem, Java, MS-Office ... verwendet wird.

vach
quelle
Danke für deine Antwort. Gilt Ihr Vorschlag, die gegabelte JVM zu entfernen, auch für das 'Maven-Surefire-Plugin'? Ich habe Ihren Vorschlag versucht, meinen MAVEN_OPTS-Speicher auf 3000 zu erhöhen. Mein Maven-Compiler hatte keine Einstellung für eine gegabelte JVM, daher musste ich dort nichts ändern. Und ja, meine Gast-VM verfügt über 4 GB RAM. Der Host-Computer verfügt über 8 GB RAM.
Kevin Meredith
2
Übrigens, der MVN-Build ist mit Ihren Vorschlägen erneut fehlgeschlagen.
Kevin Meredith
1
Normalerweise versuche ich, Prozessgabeln zu vermeiden, solange ich sie nicht zum Laufen bringe. Wenn Ihr System nur 4 GB hat, wird ~ 1 GB vom Betriebssystem verwendet. Sie haben also 3 GB Ruhe. Wenn maven mit Xms = 1 GB beginnt, beträgt der Rest des freien Speichers 2 GB. Als nächstes startete die Compilergabel mit Xms = 1 GB .... wodurch der freie Speicher auf 1 GB reduziert wird. Jetzt können Sie PermGen Memory 128MB, den gegabelten Fail-Safe-Plugin-Prozess, subtrahieren, ... Wie Sie sehen können, könnte Ihre Xmx-Einstellung höchstwahrscheinlich niemals als JVM verwendet werden, da der Speicher einfach nicht frei ist. Haben Sie versucht, JConsole zu verwenden? und HeapDumpOnOutOfMemoryError?
Vach
Ich habe den Xms1024m aus meinem MAVEN_OPTS entfernt, aber der mvn-Build ist immer noch fehlgeschlagen. Ich habe den "HeapDump ..." zu meinem MAVEN_OPTS hinzugefügt, bin mir aber nicht sicher, wo der Dump gedruckt wird. Ich schaue jetzt in JConsole.
Kevin Meredith
Dumps sind plces im jvms-Verzeichnis
vach
35

Wenn Sie zu spät antworten, um eine weitere Option anstelle der allgemeinen MAVEN_OPTSUmgebungsvariablen zu erwähnen , die an den Maven übergeben werden soll, erstellen Sie die erforderlichen JVM-Optionen.

Seit Maven 3.3.1 könnten Sie einen .mvnOrdner als Teil des betreffenden Projekts und eine jvm.configDatei als perfekten Ort für eine solche Option haben.

zwei neue optionale Konfigurationsdateien .mvn/jvm.configund .mvn/maven.configim Basisverzeichnis des Projektquellbaums. Wenn vorhanden, bieten diese Dateien Standardoptionen für JVM und Maven. Da diese Dateien Teil des Projektquellbaums sind, sind sie in allen Projektkassen vorhanden und werden bei jeder Erstellung des Projekts automatisch verwendet.

Als Teil der offiziellen Versionshinweise

In Maven ist es nicht einfach, die JVM-Konfiguration pro Projekt zu definieren. Der vorhandene Mechanismus, der auf einer Umgebungsvariablen MAVEN_OPTSund deren Verwendung basiert, ${user.home}/.mavenrcist eine weitere Option mit dem Nachteil, nicht Teil des Projekts zu sein.

Ab dieser Version können Sie die JVM-Konfiguration über eine ${maven.projectBasedir}/.mvn/jvm.configDatei definieren. Dies bedeutet, dass Sie die Optionen für Ihren Build pro Projektbasis definieren können. Diese Datei wird Teil Ihres Projekts und wird zusammen mit Ihrem Projekt eingecheckt. So dass keine Notwendigkeit mehr für MAVEN_OPTS, .mavenrcDateien. Zum Beispiel, wenn Sie die folgenden JVM-Optionen in die ${maven.projectBasedir}/.mvn/jvm.configDatei einfügen:

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

Der Hauptvorteil dieses Ansatzes besteht darin, dass die Konfiguration auf das betreffende Projekt isoliert und auch auf den gesamten Build angewendet wird und weniger fragil ist als MAVEN_OPTSbei anderen Entwicklern, die an demselben Projekt arbeiten (vergessen, es festzulegen).
Darüber hinaus werden die Optionen bei einem Projekt mit mehreren Modulen auf alle Module angewendet.

A_Di-Matteo
quelle
2
Beachten Sie, dass MaxPermSize ignoriert wird, wenn Sie JDK 8 verwenden.
GeraldScott
14

Ich habe das gleiche Problem beim Versuch, "Clean Install" mit einem Lowend 512Mb RAM VPS und einer guten CPU zu kompilieren. Führen Sie OutOfMemory aus und beenden Sie das Skript wiederholt.

Ich habe benutzt export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"und gearbeitet.

Ich bekomme immer noch einen anderen Kompilierungsfehler, weil ich Maven zum ersten Mal brauche, aber das OutOfMemory-Problem ist verschwunden.

m3nda
quelle
11

Option hinzufügen

-XX:MaxPermSize=512m

zu MAVEN_OPTS

maven-compiler-plugin Optionen

  <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>
Ilya
quelle
2
Ich habe tatsächlich die Option -XX: MaxPermSize = 1024m hinzugefügt, nachdem ich diesen Beitrag verfasst habe. Aber ich habe immer noch einen Speicherfehler. In einem anderen SO-Beitrag wurde erwähnt, dass ich der argLine des Maven-Surefire-Plugins eine Option hinzufügen muss, um den von gegabelten Threads verwendeten Speicher zu erhöhen. Ich habe es auf <argLine> -Xms256m -Xmx1024m -XX erhöht: PermSize = 128m -XX: MaxPermSize = 512m </ argLine>
Kevin Meredith
Ich hätte das erwähnen sollen ... Nein, der Maven-Build ist immer noch fehlgeschlagen.
Kevin Meredith
Fügen Sie all diese Eigenschaften hinzu maven-compilier-pluginund erhöhen Sie sie -XX:MaxPermSize, Xmxsollte =XX:MaxPermSize
Ilya
Verwenden Sie auch die Option <fork> true </ true> inmaven-compilier-plugin
Ilya
Ich habe das versucht (siehe Originalbeitrag), aber mein MVN-Build ist immer noch fehlgeschlagen.
Kevin Meredith
4

Ich habe das gleiche Problem beim Kompilieren von Druid.io, das Erhöhen der MaxDirectMemorySize hat endlich funktioniert.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
hahakubile
quelle
Seltsamerweise ist MaxDirectMemorySize standardmäßig angeblich unbegrenzt (dh Sie haben ein Limit hinzugefügt, kein bereits vorhandenes angepasst).
Tomer Gabel
4

Diese Konfiguration funktioniert in meinem Fall

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

Versuchen Sie, -XX: MaxPermSize anstelle von -XX: MaxPermGen zu verwenden

Narayan Yerrabachu
quelle
4
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Gerätemanager
quelle
3

Auf welcher Art von Betriebssystem laufen Sie?

Um mehr als 2 GB RAM zuzuweisen, muss mindestens ein 64-Bit-Betriebssystem vorhanden sein.

Dann gibt es noch ein anderes Problem. Selbst wenn Ihr Betriebssystem über unbegrenzten Arbeitsspeicher verfügt, dieser jedoch so fragmentiert ist, dass kein einziger freier Block mit 2 GB verfügbar ist, kommt es auch zu Speicherausnahmen. Beachten Sie außerdem, dass der normale Heap-Speicher nur ein Teil des vom VM-Prozess verwendeten Speichers ist. Auf einem 32-Bit-Computer können Sie Xmx wahrscheinlich nie auf 2048 MB einstellen.

Ich würde auch vorschlagen, min einen maximalen Speicher auf den gleichen Wert zu setzen, da in diesem Fall, sobald der VM der Speicher ausgeht, die erste Zeit von 1 GB von Anfang an zugewiesen wird, die VM dann einen neuen Block zuweist (vorausgesetzt, er nimmt mit zu 500 MB Blöcke) von 1,5 GB, nachdem dies zugewiesen wurde, würde das gesamte Material vom ersten Block in den neuen kopiert und danach Speicher freigegeben. Wenn der Speicher wieder knapp wird, werden die 2 GB zugewiesen und die 1,5 GB werden kopiert, wobei vorübergehend 3,5 GB Speicher zugewiesen werden.

Christofer Dutz
quelle
1

Stellen Sie beim Erstellen des Projekts auf einer Unix / Linux-Plattform die Syntax der Maven-Optionen wie folgt ein. Beachten Sie, dass einfache Qoutation Zeichen, nicht doppelte Qoutation.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
ÖMER TAŞCI
quelle
0

Die Verwendung von .mvn / jvm.config hat für mich funktioniert und hat den zusätzlichen Vorteil, mit dem Projekt verknüpft zu sein.

Colinbes
quelle
0

Dies geschieht in großen Projekten unter Windows, wenn Cygwin oder ein anderer Linux-Emulator verwendet wird (Git Bash). Durch einen Zufall funktionieren beide nicht an meinem Projekt, was ein großes Open-Source-Projekt ist. In einem sh-Skript werden einige mvn-Befehle aufgerufen. Die Speichergröße wächst auf eine Heap-Größe, die größer ist als die in Xmx angegebene und die meiste Zeit in einem Fall, in dem der zweite Windows-Prozess gestartet wird. Dies erhöht den Speicherverbrauch noch weiter.

In diesem Fall besteht die Lösung darin, eine Batchdatei und eine reduzierte Xmx-Größe zu verwenden. Anschließend sind die Maven-Vorgänge erfolgreich. Bei Interesse kann ich weitere Details verraten.

zhrist
quelle
0

Jemand hat das Problem mit dem 32-Bit-Betriebssystem bereits erwähnt. In meinem Fall war das Problem, dass ich mit 32-Bit-JDK kompilierte.

user2046211
quelle
0

Durch Erhöhen der Speichergröße in der Umgebungsvariablen 'MAVEN_OPTS' kann dieses Problem behoben werden. Bei mir hat die Erhöhung von -Xmx756M auf -Xmx1024M funktioniert.

Nidhi
quelle