it-swarm.com.de

java.lang.OutOfMemoryError: Java-Heap-Speicherplatz

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.

  1. 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.

  2. Gibt es eine Möglichkeit, den Speicherplatz zu vergrößern?

  3. Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Speicherplatz beansprucht?

91
Yatendra Goel

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.

98
Thomas Owens

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 

25
OscarRyz

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.

8
James Black

Um die Größe des Heapspeichers zu erhöhen, können Sie beim Starten von Java das Argument -Xmx verwenden. z.B.

-Xmx256M
6
Adamski
  1. 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).

  1. 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

  1. Welche Änderungen sollte ich an meinem Programm vornehmen, damit es weniger Speicherplatz beansprucht?

Das hängt von Ihrer Anwendung ab. 

  1. Legen Sie den maximalen Heapspeicher gemäß Ihrer Anwendungsanforderung fest

  2. Verursachen Sie keine Speicherverluste in Ihrer Anwendung

  3. 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:

  1. Unsachgemäße Konfiguration (Kein ausreichender Speicher zugeordnet)
  2. Die Anwendung enthält unabsichtlich Verweise auf Objekte. Dadurch wird verhindert, dass Objekte gesammelt werden
  3. Anwendungen, die Finalizer übermäßig einsetzen. Wenn eine Klasse über eine Finalize-Methode verfügt, wird der Speicherplatz für Objekte dieses Typs nicht zur Garbage Collection-Zeit zurückgefordert. Wenn der Finalizer-Thread mit der Finalisierungswarteschlange nicht mithalten kann, könnte der Java-Heapspeicher voll werden und dieser Typ der OutOfMemoryError-Ausnahme würde ausgelöst werden.

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

6
Ravindra babu

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

6
user2663609
  1. 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"

5
DKSRathore
  1. Lokale Variablen befinden sich auf dem Stack. Heap-Speicherplatz wird von Objekten belegt.

  2. Sie können die Option -Xmx verwenden.

  3. 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.

3
sepp2k

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.

1
Yishai

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)
0
Aliuk

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.

0
Xiaogang