Frage

Ich erhalte die folgenden Fehler bei der Ausführung eines Multi-Threading-Programms

java.lang.OutOfMemoryError: Java heap space

Der obige Fehler aufgetreten in eines des Gewindes.

  1. Bis meinem Wissen ist Heap Raum nur von Instanzvariablen belegt. Wenn dies richtig ist, dann, warum dieser Fehler aufgetreten ist, nachdem fein für einige Zeit als Raum zum Beispiel Variablen ausgeführt werden, zum Zeitpunkt der Objekterstellung alloted.

  2. Gibt es eine Möglichkeit, den Heap-Speicher zu erhöhen?

  3. Was ändert soll ich mein Programm gemacht, so dass es weniger Heap-Speicher greifen wird?

War es hilfreich?

Lösung

Wenn Sie Ihren Heap-Speicher erhöhen möchten, können Sie java -Xms<initial heap size> -Xmx<maximum heap size> auf der Befehlszeile verwenden. Standardmäßig werden die Werte auf der Basis der JRE-Version und Systemkonfiguration. Sie können mehr über die VM-Optionen auf der Java-Website erfahren.

Allerdings würde ich empfehlen die Anwendung Profilierungs um herauszufinden, warum Ihre Heap-Größe gegessen wird. NetBeans hat eine sehr gut Profiler mit ihm eingeschlossen. Ich glaube, es nutzt den jvisualvm unter der Haube . Mit einem Profiler, können Sie zu finden versuchen, wo viele Objekte erstellt werden, wenn Objekte erhalten Müll gesammelt und vieles mehr.

Andere Tipps

1.- Ja, aber es bezieht sich so ziemlich auf den gesamten Speicher von Ihrem Programm verwendet.

2.- Ja siehe Java VM-Optionen

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

Ie

java -Xmx2g assign 2 Gigabyte RAM als Maximum zu Ihrer App

Aber Sie sollten sehen, wenn Sie nicht über einen Speicherverlust zuerst haben.

3.- Es hängt von dem Programm. Versuchen Punktspeicherlecks. Diese Frage wäre zu schwer zu beantworten. In letzter Zeit können Sie mit JConsole Profil, um zu versuchen, um herauszufinden, wo Ihr Gedächtnis wird

Sie können an dieser Stelle aussehen wollen mehr über Speicher in der JVM zu lernen: http://developer.streamezzo.com/content/learn/articles / Optimierung-heap-Speicher-Nutzung

Ich habe es nützlich gefunden verwenden visualgc zu beobachten, wie die verschiedene Teile des Speichermodell füllt sich, was zu ändern, um zu bestimmen.

Es ist schwer zu bestimmen, welcher Teil des Speichers wurde zugeschüttet, damit visualgc, wie Sie nur wollen, können das Teil ändern, die ein Problem hat, und nicht nur zu sagen,

  

Fine! Ich gebe 1G RAM auf die JVM.

Versuchen genauer zu sein über das, was Sie tun, auf lange Sicht werden Sie wahrscheinlich das Programm besser für sie finden.

Um festzustellen, wo der Speicherverlust sein kann Sie Unit-Tests für das verwenden können, durch Testen, was der Speicher vor dem Test war und nach, und wenn es eine zu große Änderung ist, dann können Sie es untersuchen wollen, aber, Sie müssen die Prüfung tun, während des Test noch läuft.

die Heap-Größe erhöhen Sie das -Xmx Argument verwenden können, wenn Java beginnen; z.

-Xmx256M

Sie können Ihre Heap-Speicher Größe durch unten programe erhalten.

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

dann entsprechend können Sie auch Heap-Größe erhöhen, indem Sie: java -Xmx2g http://www.oracle.com/technetwork/java /javase/tech/vmoptions-jsp-140102.html

  
      
  1. Bis meinem Wissen wird Heap Raum nur von Instanzvariablen belegt. Wenn dies richtig ist, dann, warum dieser Fehler aufgetreten ist, nachdem fein für einige Zeit lief als Raum zum Beispiel Variablen wird zum Zeitpunkt der Objekterstellung alloted.
  2.   

Das heißt, Sie mehrere Objekte in Ihrer Anwendung über einen längeren Zeitraum kontinuierlich schaffen. Neue Objekte im Heap-Speicher gespeichert werden und das ist der Grund für das Wachstum im Heap-Speicher.

Heap enthält nicht nur Instanzvariablen. Es speichert alle nicht-primitive Datentypen (Objekte). Diese Objekte Lebensdauer kurz sein kann (Verfahrensblock) oder lang (bis das Objekt in Ihrer Anwendung referenziert)

  
      
  1. Gibt es eine Möglichkeit, den Heap-Speicher zu erhöhen?
  2.   

Ja. Werfen Sie einen Blick auf dieses Orakel Artikel weitere Details.

Es gibt zwei Parameter für die Heap-Größe einstellen:

-Xms: , die die Anfangs- und minimale Speichergröße setzt

-Xmx: , die die maximale Speichergröße setzt

  
      
  1. Welche Änderungen sollte ich mein Programm gemacht, so dass es weniger Heap-Speicher greifen wird?
  2.   

Es hängt von Ihrer Anwendung.

  1. Stellen Sie die maximale Heap-Speicher nach Ihrem Anwendungsbedarf

  2. verursacht keine Speicherlecks in Ihrer Anwendung

  3. Wenn Sie Speicherlecks in Ihrer Anwendung finden, finden die Ursache mit Hilfe von Profiling-Tools wie MAT , von Visual VM , jconsole usw. Sobald Sie die Ursache finden, fixiert die Lecks.

Wichtige Hinweise von Oracle Artikel

  

Mögliche Ursache: Der detaillierte Meldung Java Heap-Speicher zeigt Objekt kann nicht in der Java Heap zugewiesen werden. Dieser Fehler muss nicht unbedingt ein Speicherleck bedeuten.

Mögliche Ursachen:

  1. Eine falsche Konfiguration (nicht vollkommen ausreichend Zuweisung von Speicher)
  2. Anwendung unbeabsichtigt Verweise auf Objekte halten und dies verhindert, dass die Objekte aus wird Müll gesammelt
  3. Anwendungen, die übermäßige Verwendung von Finalizers machen. Wenn eine Klasse eine Methode finalize hat, werden Objekte dieser Art nicht ihren Platz bei der Garbage Collection Zeit zurückgewonnen haben. Wenn der Finalizerthread nicht mithalten kann, mit den Finalisierungsschlange, dann könnte der Java-Heap füllen und diese Art von OutOfMemoryError Ausnahme wäre geworfen werden.

Auf einer anderen Note, verwenden Sie besser Garbage-Collection-Algorithmen ( CMS oder G1GC )

Haben Sie einen Blick auf diese Frage für das Verständnis G1GC

  1. In den meisten Fällen wird der Code nicht optimiert. Lassen Sie die Objekte, die Sie denken, wird nicht weiter benötigt werden. Vermeiden Sie Erstellung von Objekten in Ihrer jede Schleife. Versuchen Sie Caches zu verwenden. Ich weiß nicht, wie Ihre Anwendung tut. Aber bei der Programmierung, eine Regel des normalen Lebens gilt auch

    Vorbeugen ist besser als heilen. "Erstellen Sie keine unnötigen Objekte"

  1. Lokale Variablen werden auf dem Stapel befindet. Heap-Speicher wird von Objekten belegt ist.

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

  3. Im Grunde Heap-Speicher verbraucht wird jedes Mal wenn Sie ein neues Objekt mit new zuweisen und befreit einige Zeit, nachdem das Objekt nicht mehr referenziert. So stellen Sie sicher, dass Sie halten keine Verweise auf Objekte, die Sie nicht mehr benötigen.

Nein, ich glaube, Sie Stapelspeicher denken. Heap-Speicher wird von Objekten besetzt. Die Art und Weise zu erhöhen, ist es -Xmx256m ist, die 256 mit dem Betrag ersetzen Sie in der Befehlszeile benötigen.

In Netbeans, gehen Sie auf 'Ausführen' Symbolleiste -> 'Set Projektkonfiguration' -> 'Anpassen' -> 'run' seine tauchte windo -> 'VM Option' -> fill in '-Xms2048m -Xmx2048m'. Es könnte Heap-Größe Problem lösen.

diese Ausnahme zu vermeiden, wenn Sie mit JUnit und Spring versuchen, diese Zugabe in jeder Testklasse:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top