Ich erhalte die folgende Fehlermeldung bei der Ausführung eines Multi-Threading-Programms
java.lang.OutOfMemoryError: Java heap space
Der obige Fehler ist in einem der Threads aufgetreten.
Nach meinem Wissen wird der Heap-Speicherplatz nur von Instanzvariablen belegt. Wenn dies korrekt ist, warum ist dieser Fehler dann aufgetreten, nachdem er einige Zeit einwandfrei gelaufen ist, da Speicherplatz für Instanzvariablen zum Zeitpunkt der Objekterstellung zugewiesen wird.
Gibt es eine Möglichkeit, den Speicherplatz zu vergrößern?
Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Heap-Speicher belegt?
Überprüfen Sie stackoverflow.com/questions/37335/…
– JuanZe
20. Oktober 2009 um 17:07 Uhr
Thomas Owens
Wenn Sie Ihren Heap-Platz vergrößern möchten, können Sie verwenden java -Xms<initial heap size> -Xmx<maximum heap size> auf der Kommandozeile. Standardmäßig basieren die Werte auf der JRE-Version und der Systemkonfiguration. Du kannst herausfinden mehr über die VM-Optionen auf der Java-Website.
Ich würde jedoch empfehlen, Ihre Anwendung zu profilieren, um herauszufinden, warum Ihre Heap-Größe gegessen wird. NetBeans hat eine sehr guter Profiler mit dabei. Ich glaube, es nutzt die jvisualvm unter der Haube. Mit einem Profiler können Sie versuchen herauszufinden, wo viele Objekte erstellt werden, wann Objekte von der Garbage Collection erfasst werden und vieles mehr.
Ich verwende Netbeans, aber ich weiß nicht, wie man den Profiler verwendet. Ich würde gerne mehr über den Profiler erfahren, damit ich damit Speicherlecks in meiner Anwendung finden kann.
– Yatendra
20. Oktober 2009 um 18:00 Uhr
Ich habe einen Link zu einer Seite auf der NetBeans-Site hinzugefügt (profiler.netbeans.org), das eine sehr gute Dokumentation über das Profil enthält, von den Grundlagen bis hin zur fortgeschritteneren Verwendung.
– Thomas Owens
20. Oktober 2009 um 18:03 Uhr
Standardwerte ändern sich mit Java-Versionen, es wäre schön, diese Informationen in Ihre Antwort aufzunehmen.
– Dariusz
6. Mai 2016 um 8:07 Uhr
Gerade ein ähnliches Problem behoben und zuerst versucht: java -jar division.jar -Xmx512m -Xms512m – das gibt mir den gleichen Fehler, aber wenn ich es so mache: java -Xmx512m -Xms512m -jar division.jar – alles ist in Ordnung. Daher ist auch die Reihenfolge der Parameter wichtig.
– hipokito
21. Mai 2016 um 12:15 Uhr
@hipokito Argumente nach der JAR-Datei werden als Argumente an die Methode main() der JAR-Datei übergeben[]
– Asu
11. April 2017 um 15:09 Uhr
OscarRyz
1.- Ja, aber es bezieht sich ziemlich genau auf den gesamten Speicher, der von Ihrem Programm verwendet wird.
2.- Ja, siehe Java-VM-Optionen
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
Dh
java -Xmx2g Weisen Sie Ihrer App maximal 2 Gigabyte RAM zu
Aber Sie sollten zuerst sehen, ob Sie kein Speicherleck haben.
3.- Es hängt vom Programm ab. Versuchen Sie es mit Speicherlecks. Diese Frage wäre zu schwer zu beantworten. In letzter Zeit können Sie mit JConsole ein Profil erstellen, um herauszufinden, wo Ihr Gedächtnis hingeht
Ich habe es als nützlich empfunden visualgc um zu beobachten, wie sich die verschiedenen Teile des Speichermodells füllen, um zu bestimmen, was zu ändern ist.
Es ist schwierig festzustellen, welcher Teil des Speichers voll war, daher visualgc, da Sie vielleicht nur den Teil ändern möchten, der ein Problem hat, anstatt nur zu sagen:
Bußgeld! Ich werde der JVM 1 GB RAM geben.
Versuchen Sie, genauer zu sein, was Sie tun, auf lange Sicht werden Sie das Programm wahrscheinlich besser dafür finden.
Um festzustellen, wo das Speicherleck sein könnte, können Sie Komponententests dafür verwenden, indem Sie testen, was der Speicher vor und nach dem Test war, und wenn es eine zu große Änderung gibt, möchten Sie es vielleicht untersuchen, aber Sie müssen es Führen Sie die Überprüfung durch, während Ihr Test noch läuft.
Benutzer2663609
Sie können Ihre Heap-Speichergröße durch das folgende Programm erhalten.
public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}
Um die Heap-Größe zu erhöhen, können Sie beim Starten von Java das Argument -Xmx verwenden; z.B
-Xmx256M
Gemeinschaft
Nach meinem Wissen wird der Heap-Speicherplatz nur von Instanzvariablen belegt. Wenn dies korrekt ist, warum ist dieser Fehler dann aufgetreten, nachdem er einige Zeit einwandfrei gelaufen ist, da Speicherplatz für Instanzvariablen zum Zeitpunkt der Objekterstellung zugewiesen wird.
Das bedeutet, dass Sie über einen bestimmten Zeitraum kontinuierlich mehr Objekte in Ihrer Anwendung erstellen. Neue Objekte werden im Heap-Speicher gespeichert, und das ist der Grund für das Wachstum des Heap-Speichers.
Heap enthält nicht nur Instanzvariablen. Es speichert alle nicht primitiven Datentypen (Objekte). Die Lebensdauer dieser Objekte kann kurz (Methodenblock) oder lang sein (bis das Objekt in Ihrer Anwendung referenziert wird).
Gibt es eine Möglichkeit, den Speicherplatz zu vergrößern?
Jawohl. Schauen Sie sich dieses Orakel an Artikel für mehr Details.
Es gibt zwei Parameter zum Einstellen der Heap-Größe:
-Xms:die die anfängliche und minimale Heap-Größe festlegt
-Xmx:wodurch die maximale Heap-Größe festgelegt wird
Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Heap-Speicher belegt?
Es hängt von Ihrer Anwendung ab.
Legen Sie den maximalen Heap-Speicher gemäß Ihren Anwendungsanforderungen fest
Verursachen Sie keine Speicherlecks in Ihrer Anwendung
Wenn Sie Speicherlecks in Ihrer Anwendung finden, finden Sie die Ursache mit Hilfe von Profiling-Tools wie z MATTE, Visuelle VM , jconsole usw. Sobald Sie die Ursache gefunden haben, beheben Sie die Lecks.
Ursache: Die Detailmeldung Java-Heap-Speicherplatz weist darauf hin, dass das Objekt im Java-Heap nicht zugeordnet werden konnte. Dieser Fehler weist nicht unbedingt auf einen Speicherverlust hin.
Die Anwendung enthält unbeabsichtigt Verweise auf Objekte, wodurch verhindert wird, dass die Objekte von der Garbage Collection erfasst werden
Anwendungen, die Finalizer übermäßig verwenden. Wenn eine Klasse über eine Finalize-Methode verfügt, wird der Speicherplatz von Objekten dieses Typs nicht zum Zeitpunkt der Garbage-Collection zurückgewonnen. Wenn der Finalizer-Thread mit der Finalisierungswarteschlange nicht Schritt halten kann, könnte sich der Java-Heap füllen und diese Art von OutOfMemoryError-Ausnahme würde ausgelöst werden.
Verwenden Sie in einem anderen Hinweis bessere Garbage-Collection-Algorithmen ( CMS oder G1GC)
Sehen Sie sich diese Frage an, um G1GC zu verstehen
DKSRathore
In den meisten Fällen ist der Code nicht optimiert. Geben Sie die Objekte frei, die Ihrer Meinung nach nicht mehr benötigt werden. Vermeiden Sie jedes Mal die Erstellung von Objekten in Ihrer Schleife. Versuchen Sie, Caches zu verwenden. Ich weiß nicht, wie deine Bewerbung läuft. Aber auch beim Programmieren gilt eine Regel des normalen Lebens
Vorbeugung ist besser als Heilung. “Keine unnötigen Objekte erstellen”
Überprüfen Sie stackoverflow.com/questions/37335/…
– JuanZe
20. Oktober 2009 um 17:07 Uhr