Beim Ausführen eines Multithreading-Programms wird der folgende Fehler angezeigt
Java.lang.OutOfMemoryError: Java heap space
Der obige Fehler ist in einem der Threads aufgetreten.
Soweit ich weiß, wird der Heap-Bereich nur von Instanzvariablen belegt. Wenn dies der Fall ist, warum dieser Fehler aufgetreten ist, nachdem für einige Zeit ein Fehler aufgetreten ist, da zum Zeitpunkt der Objekterstellung Platz für Instanzvariablen zugewiesen wird.
Gibt es eine Möglichkeit, den Speicherplatz zu vergrößern?
Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Speicherplatz beansprucht?
Wenn Sie den Heapspeicherplatz vergrößern möchten, können Sie Java -Xms<initial heap size> -Xmx<maximum heap size>
in der Befehlszeile verwenden. Standardmäßig basieren die Werte auf der JRE-Version und der Systemkonfiguration. Sie können mehr über die Optionen VM auf der Java-Website erfahren.
Ich würde jedoch empfehlen, ein Profil Ihrer Anwendung zu erstellen, um herauszufinden, warum Ihre Heap-Größe belegt wird. NetBeans enthält einen sehr guten Profiler . Ich glaube, es verwendet die jvisualvm
unter der Haube. Mit einem Profiler können Sie versuchen, herauszufinden, wo viele Objekte erstellt werden, wann Objekte gesammelt werden und mehr.
1.- Ja, aber es bezieht sich so ziemlich auf den gesamten Speicher, den Ihr Programm verwendet.
2.- Ja, siehe Java-Optionen VM
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
Ie
Java -Xmx2g
Weisen Sie Ihrer App maximal 2 Gigabyte RAM zu
Sie sollten jedoch zuerst sehen, ob Sie keinen Speicherleck haben.
3.- Das hängt vom Programm ab. Probieren Sie die Speicherlecks aus. Diese Frage wäre zu schwer zu beantworten. In letzter Zeit können Sie mit JConsole ein Profil erstellen, um herauszufinden, wo sich Ihre Erinnerung befindet
Auf dieser Site können Sie weitere Informationen zum Speicher in der JVM erhalten: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Ich habe es als nützlich erachtet, mit visualgc zu beobachten, wie sich die verschiedenen Teile des Speichermodells füllen, um festzustellen, was geändert werden soll.
Es ist schwierig zu bestimmen, welcher Teil des Gedächtnisses gefüllt wurde. Daher können Sie visualgc verwenden, da Sie nur den Teil ändern möchten, der ein Problem aufweist, und nicht nur sagen:
Fein! Ich werde der JVM 1G RAM geben.
Versuchen Sie, genauer zu sagen, was Sie tun, auf lange Sicht werden Sie wahrscheinlich das Programm dafür besser finden.
Um herauszufinden, wo der Speicherverlust möglicherweise liegt, können Sie Komponententests verwenden, indem Sie testen, was der Speicher vor und nach dem Test war. Wenn es zu große Änderungen gibt, möchten Sie vielleicht den Speicher untersuchen, müssen Sie aber Führen Sie die Prüfung durch, während der Test noch läuft.
Um die Größe des Heapspeichers zu erhöhen, können Sie beim Starten von Java das Argument -Xmx verwenden. z.B.
-Xmx256M
- Soweit ich weiß, wird der Heap-Bereich nur von Instanzvariablen belegt. Wenn dies der Fall ist, warum dieser Fehler aufgetreten ist, nachdem für einige Zeit ein Fehler aufgetreten ist, da zum Zeitpunkt der Objekterstellung Platz für Instanzvariablen zugewiesen wird.
Das bedeutet, dass Sie in Ihrer Anwendung über einen bestimmten Zeitraum kontinuierlich mehr Objekte erstellen. Neue Objekte werden im Heap-Speicher abgelegt. Dies ist der Grund für das Wachstum des Heap-Speichers.
Heap enthält nicht nur Instanzvariablen. Es werden alle nicht primitiven Datentypen (Objekte) gespeichert. Die Lebensdauer dieser Objekte kann kurz sein (Methodenblock) oder lang sein (bis das Objekt in Ihrer Anwendung referenziert wird).
- Gibt es eine Möglichkeit, den Speicherplatz zu vergrößern?
Ja. Schauen Sie sich diesen Oracle Artikel für weitere Details an.
Es gibt zwei Parameter zum Einstellen der Heap-Größe:
-Xms:, um die anfängliche und minimale Größe des Heapspeichers festzulegen
-Xmx:, um die maximale Größe des Heapspeichers festzulegen
- Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Speicherplatz beansprucht?
Das hängt von Ihrer Anwendung ab.
Legen Sie den maximalen Heapspeicher gemäß Ihrer Anwendungsanforderung fest
Verursachen Sie keine Speicherverluste in Ihrer Anwendung
Wenn Sie in Ihrer Anwendung Speicherlecks finden, ermitteln Sie die Ursache mit Hilfe von Profilierungswerkzeugen wie MAT , Visual VM , jconsole etc. Sobald Sie das Stammverzeichnis gefunden haben Ursache, beheben Sie die Lecks.
Wichtige Hinweise von Oracle Artikel
Ursache: Der Java-Heap-Bereich für die Detailnachricht zeigt an, dass das Objekt nicht im Java-Heapspeicher zugeordnet werden konnte. Dieser Fehler bedeutet nicht notwendigerweise einen Speicherverlust.
Mögliche Gründe:
Verwenden Sie in einem anderen Hinweis bessere Algorithmen für die Müllsammlung (CMS oder G1GC)
Werfen Sie einen Blick auf diese Frage , um G1GC zu verstehen
Sie können die Speichergröße Ihres Heapspeichers durch das unten angegebene Programm ermitteln.
public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}
sie können die Heap-Größe auch entsprechend erhöhen, indem Sie Folgendes verwenden: Java -Xmx2g http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jsp-140102.html
In den meisten Fällen wird der Code nicht optimiert. Geben Sie die Objekte frei, die Ihrer Meinung nach nicht weiter benötigt werden. Vermeiden Sie jedes Mal die Erstellung von Objekten in Ihrer Schleife. Versuchen Sie, Caches zu verwenden. Ich weiß nicht, wie es Ihrer Bewerbung geht. Aber beim Programmieren gilt auch eine Regel des normalen Lebens
Vorbeugung ist besser als Heilung. "Erstellen Sie keine unnötigen Objekte"
Lokale Variablen befinden sich auf dem Stack. Heap-Speicherplatz wird von Objekten belegt.
Sie können die Option -Xmx
verwenden.
Grundsätzlich wird Heap-Speicherplatz immer dann belegt, wenn Sie ein neues Objekt mit new
zuweisen, und es wird freigegeben, nachdem das Objekt nicht mehr referenziert wurde. Stellen Sie daher sicher, dass Sie keine Verweise auf Objekte beibehalten, die Sie nicht mehr benötigen.
Nein, ich denke, Sie denken an Stack Space. Heap-Speicherplatz wird von Objekten belegt. Die Erhöhung ist -Xmx256m, wodurch die 256 durch die Menge ersetzt werden, die Sie in der Befehlszeile benötigen.
Um diese Ausnahme zu vermeiden, sollten Sie, wenn Sie JUnit und Spring verwenden, dies in jeder Testklasse hinzufügen:
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Gehen Sie in netbeans zur Symbolleiste "Ausführen", -> "Projektkonfiguration festlegen" -> "Anpassen" -> "Ausführen" des aufgerufenen Fensters -> "VM Option" -> "-Xms2048m" -Xmx2048m '. Es könnte ein Heap-Größenproblem lösen.