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.

1voto

samuelru Punkte 109

Wenn dieser Fehler direkt nach der Ausführung Ihrer Junit-Tests auftritt, dann sollten Sie Bauen Sie -> Umbauprojekt .

1voto

nccc Punkte 985

Wenn alles andere fehlschlägt, versuchen Sie zusätzlich zur Erhöhung der maximalen Heap-Größe auch die Swap-Größe zu erhöhen. Für Linux sind die entsprechenden Anweisungen ab sofort zu finden in https://linuxize.com/post/create-a-linux-swap-file/ .

Dies kann hilfreich sein, wenn Sie z. B. etwas Großes für eine eingebettete Plattform kompilieren.

0voto

Antonin Dioulo Punkte 11

Wenn Sie diesen Fehler beim Starten von eclipse birt erhalten 1- gehen Sie in die Datei der Eclipse-Konfiguration 2- Sie müssen eclipse.init öffnen 3- ändern Sie den RAM-Speicher, Sie können diesen erhöhen, ich gebe ein Beispiel.

meine alten Informationen waren: -Xmx128m -XX:MaxPermSize=128m

die neue Änderung, die ich vorgenommen habe:

-Xmx512m -XX:MaxPermSize=512m

Diese Änderung wird es mir ermöglichen, den Java-Heap-Speicherplatz aufzulösen, wenn ich meinen Bericht in meinem Browser starte.

感謝

0voto

satish Punkte 1447

Wenn dieses Problem in Wildfly 8 und JDK1.8 auftritt, dann müssen wir MaxMetaSpace-Einstellungen anstelle von PermGen-Einstellungen angeben.

Zum Beispiel müssen wir die folgende Konfiguration in der Datei setenv.sh von wildfly hinzufügen. JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"

Weitere Informationen finden Sie unter Wildfly Heap Problem

0voto

SoulWanderer Punkte 304

Wenn Sie immer wieder Verweise auf ein Objekt zuweisen und behalten, werden Sie den gesamten Speicher füllen.

Eine Möglichkeit ist es, eine transparente Datei zu schließen und zu öffnen, wenn sie die Registerkarte wechseln (Sie behalten nur einen Zeiger auf die Datei, und wenn der Benutzer die Registerkarte wechselt, schließen und bereinigen Sie alle Objekte ... es wird die Dateiänderung langsamer machen ... aber ...), und vielleicht nur 3 oder 4 Dateien im Speicher halten.

Eine andere Sache, die Sie tun sollten, ist, wenn der Benutzer eine Datei öffnet, diese zu laden und jeden OutOfMemoryError abzufangen, dann (da es nicht möglich ist, die Datei zu öffnen) diese Datei zu schließen, ihre Objekte zu bereinigen und den Benutzer zu warnen, dass er nicht verwendete Dateien schließen sollte.

Ihre Idee, den virtuellen Speicher dynamisch zu erweitern, löst das Problem nicht, denn der Rechner hat nur begrenzte Ressourcen, daher sollten Sie vorsichtig sein und mit Speicherproblemen umgehen (oder zumindest vorsichtig mit ihnen umgehen).

Ein paar Hinweise, die ich im Zusammenhang mit Speicherlecks gesehen habe, sind:

--> Beachten Sie, dass, wenn Sie etwas in eine Sammlung und danach vergessen, Sie immer noch einen starken Verweis auf sie, so annullieren die Sammlung, bereinigen Sie es oder tun Sie etwas mit ihm ... wenn nicht finden Sie ein Speicherleck schwer zu finden.

--> Vielleicht kann die Verwendung von Sammlungen mit schwachen Referenzen (weakhashmap...) bei Speicherproblemen helfen, aber Sie muss Seien Sie vorsichtig, denn Sie könnten feststellen, dass das gesuchte Objekt bereits eingesammelt wurde.

--> Eine andere Idee, die ich gefunden habe, ist eine persistente Sammlung zu entwickeln, die auf Datenbankobjekten gespeichert wird, die am wenigsten benutzt und transparent geladen werden. Dies wäre wahrscheinlich der beste Ansatz...

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