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.

315voto

Ben Childs Punkte 4230

Letztendlich haben Sie immer eine begrenzte Anzahl von Heaps, die Sie verwenden können, egal auf welcher Plattform Sie arbeiten. Unter Windows 32 Bit ist dies etwa 2GB (nicht speziell Heap, sondern Gesamtspeichermenge pro Prozess). Es ist nur so, dass Java sich dafür entschieden hat, den Standardwert kleiner zu machen (vermutlich, damit der Programmierer keine Programme erstellen kann, die eine unkontrollierte Speicherzuweisung haben, ohne auf dieses Problem zu stoßen und genau untersuchen zu müssen, was sie tun).

Es gibt also mehrere Möglichkeiten, den benötigten Speicherplatz zu ermitteln oder den verwendeten Speicherplatz zu reduzieren. Ein häufiger Fehler bei Garbage-Collecting-Sprachen wie Java oder C# besteht darin, Verweise auf Objekte zu behalten, die Sie nicht mehr verwenden, oder viele Objekte zuweisen, wenn man sie auch Wiederverwendung sie stattdessen. Solange Objekte einen Verweis auf sie haben, werden sie weiterhin Heap-Speicherplatz verwenden, da der Garbage Collector sie nicht löschen wird.

In diesem Fall können Sie einen Java-Speicher-Profiler verwenden, um festzustellen, welche Methoden in Ihrem Programm eine große Anzahl von Objekten zuweisen, und dann feststellen, ob es eine Möglichkeit gibt, dafür zu sorgen, dass sie nicht mehr referenziert werden, oder sie gar nicht erst zuzuweisen. Eine Möglichkeit, die ich in der Vergangenheit verwendet habe, ist "JMP" http://www.khelekore.org/jmp/ .

Wenn Sie feststellen, dass Sie diese Objekte aus einem bestimmten Grund zuweisen und Referenzen behalten müssen (je nachdem, was Sie tun, könnte dies der Fall sein), müssen Sie nur die maximale Heap-Größe erhöhen, wenn Sie das Programm starten. Sobald Sie jedoch ein Speicherprofil erstellt haben und verstehen, wie Ihre Objekte zugewiesen werden, sollten Sie eine bessere Vorstellung davon haben, wie viel Speicher Sie benötigen.

Wenn Sie nicht garantieren können, dass Ihr Programm in einer endlichen Menge an Speicher läuft (vielleicht abhängig von der Größe der Eingabe), werden Sie immer auf dieses Problem stoßen. Erst wenn Sie all diese Möglichkeiten ausgeschöpft haben, müssen Sie sich mit der Zwischenspeicherung von Objekten auf der Festplatte usw. befassen. An diesem Punkt sollten Sie einen sehr guten Grund haben, um zu sagen: "Ich brauche Xgb Speicher" für etwas und Sie können das Problem nicht umgehen, indem Sie Ihre Algorithmen oder Speicherzuweisungsmuster verbessern. Im Allgemeinen ist dies nur bei Algorithmen der Fall, die mit großen Datenmengen arbeiten (z. B. eine Datenbank oder ein wissenschaftliches Analyseprogramm), und dann werden Techniken wie Caching und Memory Mapped IO nützlich.

162voto

Dave Webb Punkte 184809

Führen Sie Java mit der Befehlszeilenoption -Xmx die den maximal Größe des Heaps.

Siehe hier für Details .

107voto

allenhwkim Punkte 26366

Sie könnten angeben per Projekt, wie viel Heap-Speicher Ihr Projekt benötigt

Das Folgende ist für Eclipse Helios/Juno/Kepler :

Rechter Mausklick auf

 Run As - Run Configuration - Arguments - Vm Arguments, 

dann fügen Sie Folgendes hinzu

-Xmx2048m

77voto

PeakGen Punkte 20064

Die Erhöhung der Heap-Größe ist keine "Lösung", sondern ein "Pflaster", das zu 100 % temporär ist. Es wird an anderer Stelle wieder abstürzen. Um diese Probleme zu vermeiden, schreiben Sie leistungsstarken Code.

  1. Verwenden Sie, wo immer möglich, lokale Variablen.
  2. Vergewissern Sie sich, dass Sie das richtige Objekt auswählen (EX: Auswahl zwischen String, StringBuffer und StringBuilder)
  3. Verwenden Sie ein gutes Codesystem für Ihr Programm (EX: Verwendung statischer Variablen vs. nicht statischer Variablen)
  4. Andere Dinge, die an Ihrem Code arbeiten könnten.
  5. Versuchen Sie, sich mit multy THREADING zu bewegen

33voto

David Punkte 5678

Großer Vorbehalt ---- in meinem Büro haben wir festgestellt, dass wir (auf einigen Windows-Maschinen) nicht mehr als 512m für den Java-Heap zuweisen konnten. Es stellte sich heraus, dass dies auf das Antivirenprodukt von Kaspersky zurückzuführen war, das auf einigen dieser Rechner installiert war. Nachdem wir das AV-Produkt deinstalliert hatten, konnten wir mindestens 1,6gb zuweisen, d.h, -Xmx1600m (m ist obligatorisch, da es sonst zu einem weiteren Fehler "Too small initial heap" führt) funktioniert.

Ich weiß nicht, ob dies auch bei anderen AV-Produkten der Fall ist, aber vermutlich liegt es daran, dass das AV-Programm in jedem Adressraum einen kleinen Speicherblock reserviert und so eine einzige wirklich große Zuweisung verhindert.

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