587 Stimmen

Wie geht man mit "java.lang.OutOfMemoryError: Java heap space"-Fehler?

Ich schreibe ein clientseitiges Schaukel Anwendung (grafischer Schriftdesigner) auf Java 5 . In letzter Zeit stoße ich auf java.lang.OutOfMemoryError: Java heap space Fehler, weil ich bei der Speichernutzung nicht sparsam bin. Der Benutzer kann eine unbegrenzte Anzahl von Dateien öffnen, und das Programm behält die geöffneten Objekte im Speicher. Nach einer kurzen Recherche fand ich Ergonomie in der virtuellen Java-Maschine 5.0 und andere sagen, dass die JVM auf Windows-Rechnern standardmäßig die maximale Heap-Größe als 64MB .

Wie sollte ich in dieser Situation mit dieser Einschränkung umgehen?

Ich könnte die maximale Heap-Größe mit Kommandozeile Option zu Java, aber dazu müsste man den verfügbaren Arbeitsspeicher ermitteln und ein Startprogramm oder Skript schreiben. Außerdem ist die Erhöhung auf einige Endliche max nicht letztlich das Problem loszuwerden.

Ich könnte einen Teil meines Codes umschreiben, um Objekte häufig im Dateisystem zu persistieren (die Verwendung einer Datenbank ist das Gleiche), um Speicherplatz freizugeben. Es könnte funktionieren, aber es ist wahrscheinlich auch eine Menge Arbeit.

Könnten Sie mir Einzelheiten zu den oben genannten Ideen oder einige Alternativen nennen, z. B. automatischer virtueller Speicher, dynamisches Erweitern der Heap-Größe Das wird großartig sein.

11voto

Pradip Bhatt Punkte 658

Folgen Sie den nachstehenden Schritten:

  1. Öffnen Sie catalina.sh von tomcat/bin.

  2. Ändern Sie JAVA_OPTS in

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m 
    -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
  3. Starten Sie Ihren Kater neu

9voto

Musa Punkte 2450

Standardmäßig verwendet die JVM für die Entwicklung eine kleine Größe und eine kleine Konfiguration für andere leistungsbezogene Funktionen. Für die Produktion können Sie jedoch z. B. folgende Einstellungen vornehmen (zusätzlich kann eine anwendungsserverspezifische Konfiguration vorhanden sein) -> (Wenn immer noch nicht genügend Speicher vorhanden ist, um die Anforderung zu erfüllen, und der Heap bereits die maximale Größe erreicht hat, tritt ein OutOfMemoryError auf)

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

Zum Beispiel: Auf der Linux-Plattform für den Produktionsmodus sind die bevorzugten Einstellungen.

Nach dem Herunterladen und Konfigurieren des Servers auf diese Weise http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

1.erstellen Sie die Datei setenv.sh im Ordner /opt/tomcat/bin/

   touch /opt/tomcat/bin/setenv.sh

2. öffnen und schreiben Sie diese Parameter zur Einstellung des bevorzugten Modus.

nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"

3. service tomcat restart

Beachten Sie, dass die JVM mehr Speicher als nur den Heap verwendet. Zum Beispiel Java-Methoden, Thread-Stacks und native Handles werden im Speicher getrennt vom Heap zugewiesen, ebenso wie die JVM-internen Datenstrukturen.

9voto

Talha Akbar Punkte 97

Fügen Sie diese Zeile zu Ihrer gradle.properties-Datei hinzu

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Es sollte funktionieren. Sie können MaxPermSize entsprechend ändern, um Ihr Heap-Problem zu lösen

8voto

chaukssey Punkte 81

Einfacher Weg zur Lösung OutOfMemoryError in Java ist es möglich, die maximale Heap-Größe mit Hilfe der JVM-Optionen zu erhöhen -Xmx512M Dies löst sofort den OutOfMemoryError. Dies ist meine bevorzugte Lösung, wenn ich OutOfMemoryError in Eclipse, Maven oder ANT während des Aufbaus Projekt, weil auf der Grundlage Größe des Projekts können Sie leicht lief aus dem Speicher.

Hier ist ein Beispiel für die Erhöhung der maximalen Heap-Größe der JVM, auch seine besser zu halten -Xmx zu -Xms Verhältnis entweder 1:1 oder 1:1,5, wenn Sie Einstellung Heap-Größe in Ihrer Java-Anwendung sind.

export JVM_ARGS="-Xms1024m -Xmx1024m"

Referenz-Link

7voto

mwangi Punkte 1588

Ich habe an anderer Stelle gelesen, dass man versuchen kann, java.lang.OutOfMemoryError abzufangen und im Catch-Block alle Ressourcen freizugeben, von denen man weiß, dass sie viel Speicher verbrauchen könnten, Verbindungen zu schließen und so weiter, und dann ein System.gc() und versuchen Sie dann erneut, was immer Sie vorhatten zu tun.

Eine andere Möglichkeit ist dies, obwohl ich nicht weiß, ob dies funktionieren würde, aber ich teste gerade, ob es bei meiner Anwendung funktioniert.

Die Idee ist, Garbage Collection durch den Aufruf von System.gc() durchzuführen, was bekanntermaßen den freien Speicher erhöht. Sie können dies immer wieder überprüfen, nachdem ein speicherfressender Code ausgeführt wurde.

//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X