Java-Speicher: Heap-Speicher und Garbage Collector

Erfahren Sie, wie Java verwaltet Speicher durch Heap-Speicher und Müllabfuhr. Speicherzuweisung zu verstehen, kann Speicherverlust in Java-Programmen helfen, zu vermeiden.

A+ A-

Vor kurzem schrieb ich eine Java - Anwendung , die, wenn sie ausgeführt werden , ziemlich viel verlangt Speicher und ich begann die OutOfMemory Fehler zu erhalten:

 Fehler: java.lang.OutOfMemoryError: Java Heap-Speicher 

Dies geschieht häufig, wenn wir speicherfressenden Programme ausführen müssen. Im Folgenden sind einige Möglichkeiten, um solche Probleme zu lösen.

Was ist Java Heap-Speicher?

Zunächst einmal lässt verstehen, was Heap-Speicher ist. Nun, Java verwendet Speicher vor allem in den Anordnungen von Heap und Stack . Java hält die Parameter, die von einem übergeben werden rufenden Methode zu einer aufgerufenen Methode , in der Form einer Stapelstruktur (dh Parameter geschoben werden und tauchte nach der Notwendigkeit des Stapels out). Auf der anderen Seite ist heap ein zufällig griffenen Speicherraum, in dem Java erstellt und hält Objekte. Java erstellt das Objekt in diesem Heap-Speicher, wo immer es findet Raum genug, um das Objekt zu enthalten. Also, wenn Sie ein neues Objekt (zB neue erstellen String () ;) das Objekt wird in dem Heap - Speicher erstellt und belegt den Speicher, der es in passen. Während der Garbage Collection, befreit Java den Heap-Speicher dieser Objekte, die nicht mehr referenziert werden. Aber wenn die Anzahl der referenzierten (dh "erforderlich") Objekte hält auf die Erhöhung und wir Ehrerbietung sie nicht -die JVM läuft aus dem Heap-Speicher.

Die Speichermenge, die eine Klasse würde hängt Mitglieder von der Anzahl und der Art der Daten erforderlich ist.

  1. Die Klasse selbst erfordert ein Minimum von 8 Bytes
  2. Jedes Datenelement benötigt 4 Byte (long und Doppel erfordern 8 Byte). Selbst eine Boolesche Variable ist 4 Bytes verwenden, obwohl es nur ein Bit muss gespeichert zu bekommen.
  3. Menge des verwendeten Speichers wächst in Blöcken von 8 Bytes
Optimieren Sie Ihre Java-Programme

Der erste Schritt, um dieses Problem zu umgehen, sollten durch das Programm zu gehen und sehen, wie es modifiziert werden könnte, um es weniger Speicher machen verwenden. Da lange die Kosten für Speicher hat sich im Vergleich extrem niedrig gewesen mit dem, was sie während der 1960er Jahre war. Und Programmierer haben ihre Programme ziemlich extravagant in Bezug auf Speicher Geld werden. Doch noch mehr als oft nicht, brauchen wir Programme zu schreiben, die mehr Speicher benötigen als verfügbar. Genügsamkeit in Zusammenhang mit der Speichernutzung ist immer gut, weil es nicht nur die Chancen der Programmabsturz reduziert, sondern auch manchmal erhöht es die Geschwindigkeit der Ausführung.

Sie sollten Objekte gesetzt null sein , wenn sie nicht mehr in Ihrem Code erforderlich sind. Dies ist umso wichtiger, wenn Sie eine Schleife ausgeführt werden, in dem Sie Objekt erstellen (s), aber dann sie nicht verwerfen, wenn sie nicht benötigt werden.

Nutzen Sie Java Garbage Collector Methode

Der zweite Schritt zur Optimierung der Speichernutzung könnte explizit die Garbage Collection - Methode aufzurufen. Java ruft diese Methode automatisch und bei Bedarf und gibt den Platz im Speicher, die die Objekte enthält, die nicht mehr referenziert werden. Sie können aber auch diese Methode aufrufen, explizit in Ihrem Code (zum Beispiel nach einer "großen Aufgabe" erreicht wird und nächste "große Aufgabe" ist zu beginnen). Um den Garbage Collector aufzurufen, verwenden Sie:

 Runtime.getRuntime () gc (). 

Sie können den Status des Speichers zu überwachen vor und nach gc () -Methode aufgerufen wird.

 System.out.println ( "nnCalling Garbage Collectornn");
System.out.println ( "Freier Speicher VOR:" + Runtime.getRuntime () freememory ().);
Runtime.getRuntime () gc ().
System.out.println ( "Freier Speicher NACH:". + Runtime.getRuntime () freememory ());
System.out.println ( "nnGarbage Sammlung finishednn"); 

Freememory () Methode gibt Menge des freien Speichers in Bytes gemessen. Für andere von Runtime - Klasse Methoden siehe Java - API

Geben Sie mehr Arbeitsspeicher JVM

Die Bemühungen zur Optimierung der Speichernutzung trotz manchmal JVM in der Tat nicht braucht mehr Speicher. In solchen Fällen können wir über die Kommandozeile sagen JVM eine bestimmte Menge an Speicher zu verwenden:

 java -Xms2000m -Xmx3500m 

-Xms Und -Xmx schaltet die Menge an Swap - Speicher (virtueller Speicher) angeben , dass JVM in Ihrer Maschine verwenden können.

-Xms Gibt die minimale (dh initial) Speichermenge

-Xmx Gibt die maximale Speichermenge , die JVM nutzen könnten.

Diese Speicherwerte sollten in Megabytes angegeben werden.

So, das war über Java-Speicher durch Heap-Speicher und Garbage Collection-Mechanismus verwaltet. Dies sind intelligente Entscheidungen und alle Java-Programmierer sollten klares Verständnis, wie Java behandelt Speicher. Nur dann können Sie effizient intensive Programme auf Speicher zu arbeiten.