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.

6voto

Leigh Punkte 4198

Wenn Sie den Speicherverbrauch zur Laufzeit überwachen müssen, können Sie die java.lang.management Paketangebote MBeans die zur Überwachung der Speicherpools in Ihrer VM (z. B. Eden Space, Tenured Generation usw.) und des Verhaltens der Garbage Collection verwendet werden kann.

Der von diesen MBeans gemeldete freie Heap-Speicherplatz wird je nach GC-Verhalten stark variieren, insbesondere wenn Ihre Anwendung viele Objekte erzeugt, die später GC-ed werden. Ein möglicher Ansatz besteht darin, den freien Heap-Speicherplatz nach jedem Full-GC zu überwachen, was Sie möglicherweise nutzen können, um eine Entscheidung über die Freigabe von Speicher durch die Persistierung von Objekten zu treffen.

Letzten Endes ist es am besten, den Speicherbedarf so weit wie möglich zu begrenzen, ohne die Leistung zu beeinträchtigen. Wie bereits in einem früheren Kommentar angemerkt, ist der Speicher immer begrenzt, aber Ihre Anwendung sollte eine Strategie für den Umgang mit erschöpftem Speicher haben.

6voto

Nima Ganji Punkte 431

In Android Studio fügen Sie diese Zeile am Ende von gradle.properties (Global Properties) :

...
org.gradle.jvmargs=-XX\:MaxHeapSize\=1024m -Xmx1024m 

Wenn es nicht funktioniert, können Sie es mit einer Heap-Größe von mehr als 1024 erneut versuchen.

5voto

Ich habe das gleiche Problem von Java Heap-Größe konfrontiert.

Ich habe zwei Lösungen, wenn Sie Java 5 (1.5) verwenden.

  1. Installieren Sie einfach jdk1.6 und gehen Sie zu den Einstellungen von Eclipse und setzen Sie den jre Pfad von jav1 1.6 wie Sie installiert haben.

  2. Prüfen Sie Ihr VM-Argument und lassen Sie es gelten, was immer es auch ist. Fügen Sie einfach eine Zeile mit allen Argumenten unter VM-Argumente ein -Xms512m -Xmx512m -XX:MaxPermSize=...m(192m).

Ich denke, es wird funktionieren...

5voto

Morteza Bandi Punkte 574

In meinem Fall wurde das Problem durch Zuweisung von mehr Speicher an Shared build process heap size in den intellij-Einstellungen.

Gehen Sie zu intellij settings > Compiler > Shared build process heap size

enter image description here

5voto

Neeraj Singh Punkte 951

Wenn Sie Android Studio verwenden, fügen Sie einfach diese Zeilen mit gradle.properties fichier

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

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