wake-up-neo.net

Fehler beim Erstellen des Speichers

Seit heute schlägt mein Maven-Kompilieren 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)

[ERROR] Kein Speicher mehr. Um die Speicherkapazität zu erhöhen, verwenden Sie -Xmx Flag beim Start (Java -Xmx128M ...)

Seit gestern hatte ich ein Maven-Compile erfolgreich ausgeführt. 

Ab heute habe ich meinen Haufen auf 3 GB erhöht. Außerdem habe ich nur 2-3 kleine Codezeilen geändert, daher verstehe ich diesen Fehler nicht.

[email protected]:/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.

    <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>
72
Kevin Meredith

Von was für einem 'Web'-Modul sprichst du? Ist es ein einfacher Krieg und hat der Verpackungstyp Krieg? 

Wenn Sie nicht das Web-Toolkit (GWT) von Google verwenden, müssen Sie keinen gwt.extraJvmArgs angeben.

Das Zusammenstellen des Kompilierungsprozesses ist möglicherweise nicht die beste Idee, da Sie dann einen zweiten Prozess starten, der MAVEN_OPTS überhaupt ignoriert und die Analyse schwieriger macht.

Ich würde also versuchen, den Xmx zu erhöhen, indem Sie MAVEN_OPTS setzen

export MAVEN_OPTS="-Xmx3000m"

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>

Das Erhöhen von -XX:MaxPermSize=512m sollte nicht erforderlich sein, da, wenn Dauerwelle der Grund für das Problem ist, der Fehler Java.lang.OutOfMemoryError: PermGen space erwartet wird.

Wenn das Problem dadurch nicht gelöst wird, können Sie Heap-Dumps für die weitere Analyse erstellen, indem Sie -XX:+HeapDumpOnOutOfMemoryError hinzufügen. Darüber hinaus können Sie jconsole.exe im bin-Verzeichnis von Java verwenden, um während der Kompilierung eine Verbindung zum jvm herzustellen und zu sehen, was im Heap des jvm abläuft.

Eine andere Idee (vielleicht eine dumme), die mir einfiel, haben Sie genug RAM in Ihrer Maschine? Die Größe des Arbeitsspeichers ist "Nice". Wenn Ihr Host jedoch nur über 4 GB verfügt, besteht das Problem, dass Java den definierten Arbeitsspeicher nicht verwenden kann, da er bereits vom Betriebssystem, Java, MS-Office usw. verwendet wird.

111
vach

Wenn Sie zu spät antworten, um noch eine andere Option zu nennen, als die allgemeine Umgebungsvariable MAVEN_OPTS , die an die Maven übergeben wird, erstellen Sie die erforderlichen JVM-Optionen.

Seit Maven 3.3.1 können Sie einen .mvn-Ordner als Teil des betreffenden Projekts und eine jvm.config-Datei als perfekten Ort für eine solche Option verwenden.

zwei neue optionale Konfigurationsdateien .mvn/jvm.config und .mvn/maven.config, die sich im Basisverzeichnis des Projektquellenbaums befinden. Falls vorhanden, enthalten diese Dateien Standardoptionen für Jvm und Maven. Da diese Dateien Teil der Projektquellstruktur sind, sind sie in allen Projektprüfungen vorhanden und werden bei jeder Erstellung des Projekts automatisch verwendet.

Im Rahmen der offiziellen Versionshinweise

In Maven ist es nicht einfach, die JVM-Konfiguration pro Projekt zu definieren. Der vorhandene Mechanismus, der auf einer Umgebungsvariablen MAVEN_OPTS und der Verwendung von ${user.home}/.mavenrc basiert, ist eine andere Option, mit dem Nachteil, dass er nicht Teil des Projekts ist.

Ab dieser Version können Sie die JVM-Konfiguration über die ${maven.projectBasedir}/.mvn/jvm.config-Datei definieren. Dies bedeutet, dass Sie die Optionen für Ihren Build pro Projekt festlegen können. Diese Datei wird Teil Ihres Projekts und wird zusammen mit Ihrem Projekt eingecheckt. Somit sind keine MAVEN_OPTS-, .mavenrc-Dateien mehr erforderlich. Wenn Sie beispielsweise die folgenden JVM-Optionen in die Datei ${maven.projectBasedir}/.mvn/jvm.config einfügen:

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

Der Hauptvorteil dieses Ansatzes besteht darin, dass die Konfiguration für das betreffende Projekt isoliert und auch für das gesamte Build angewendet wird und weniger anfällig ist als MAVEN_OPTS für andere Entwickler, die an demselben Projekt arbeiten (und das Festlegen vergessen).
Darüber hinaus werden die Optionen bei einem Multimodulprojekt auf alle Module angewendet.

25
A_Di-Matteo

Ich habe das gleiche Problem beim Kompilieren der "sauberen Installation" mit einem Low End 512 MB RAM VPS und einer guten CPU. Führen Sie OutOfMemory und das Skript wiederholt aus.

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

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

12
erm3nda

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

Auf welchem ​​Betriebssystem laufen Sie?

Um mehr als 2 GB RAM zuzuweisen, muss es mindestens ein 64-Bit-Betriebssystem 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 von 2 GB verfügbar ist, kommt es auch zu Ausnahmefällen bezüglich des Arbeitsspeichers. Beachten Sie auch, dass der normale Heap-Speicher nur ein Teil des Speichers ist, den der VM - Prozess verwendet. Auf einem 32-Bit-Computer können Sie Xmx wahrscheinlich nie auf 2048 MB einstellen.

Ich würde auch vorschlagen, min und max Speicher auf den gleichen Wert zu setzen, da in diesem Fall die erste Zeit, die 1 GB von Anfang an zugewiesen wird, die VM dann zuweist, sobald der VM keinen Speicher mehr hat Wenn ein neuer Block (unter der Annahme, dass er sich mit 500 MB-Blöcken vergrößert) mit einer Größe von 1,5 GB zugewiesen wird, kopiert er das gesamte Material von Block 1 in den neuen und gibt anschließend Speicher frei. Wenn der Speicher wieder voll ist, werden die 2 GB zugewiesen und die 1,5 GB werden kopiert, wobei vorübergehend 3,5 GB Speicher zugewiesen werden.

3
Christofer Dutz

Das gleiche Problem hatte ich beim Kompilieren von Druid.io. Die Erhöhung der MaxDirectMemorySize-Funktion hat schließlich funktioniert.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
2
hahakubile
_Java_OPTIONS="-Xmx3G" mvn clean install
1
DeviceManager

Stellen Sie beim Erstellen des Projekts auf der Unix/Linux-Plattform die Maven-Optionssyntax wie folgt ein. Beachten Sie, dass einzelne Qoutationszeichen keine doppelte Qoutation sind.

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

Die Verwendung von .mvn/jvm.config für mich plus hat den zusätzlichen Vorteil, dass es mit dem Projekt verknüpft ist.

0
colinbes

Dies geschieht in großen Projekten unter Windows, wenn cygwin oder ein anderer Linux-Emulator verwendet wird (git bash). Mit etwas Zufall funktionieren beide nicht bei meinem Projekt, was ein großes Open Source-Projekt ist. In einem sh-Skript werden einige mvn-Befehle aufgerufen. Die Speichergröße wird größer als die in Xmx angegebene Größe des Heapspeichers. Meistens wird in einem Fall ein zweiter Windows-Prozess gestartet. Dadurch wird der Speicherverbrauch noch höher.

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

0
zhrist

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

0
user2046211

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

0