Heim > 类库下载 > java类库 > Java-Speicher und GC

Java-Speicher und GC

高洛峰
Freigeben: 2016-10-20 10:45:57
Original
1558 Leute haben es durchsucht

Java-Speicherbereich und Speicherüberlauf

Speicherzuordnungsdiagramm in der Java Virtual Machine:

Java-Speicher und GC

Die Eigenschaften jedes Bereichs sind in der folgenden Tabelle zusammengefasst:

Java-Speicher und GC

Zusätzliche Erklärung:

In einer Multithread-Situation müssen möglicherweise mehrere Threads Speicher auf dem Heap zuweisen, dann können Probleme bei der Synchronisierung der Speicherzuweisung auftreten. Die Lösung ist: Zweitens: Die eine besteht darin, Speicherzuweisungsaktionen zu synchronisieren, die andere darin, TLAB zu verwenden, dh jedem Thread im Java-Heap einen kleinen Thread-privaten lokalen Thread-Zuweisungspuffer zuzuweisen. Wenn ein Thread auf diese Weise Speicher zuweisen muss, tut er dies in seinem eigenen TLAB und vermeidet so den Overhead der Synchronisierung. Eine Synchronisierung ist jedoch weiterhin erforderlich, wenn TLAB vollständig zugewiesen und erneut zugewiesen wird.

Um festzustellen, ob eine Klasse eine nutzlose Klasse ist, gelten folgende Bedingungen für „kann“ recycelt werden: 1. Alle Instanzen der Klasse wurden recycelt ; 2. Laden Der ClassLoader dieser Klasse wurde recycelt. 3 Das java.lang.Class-Objekt dieser Klasse wird nirgendwo referenziert. Beachten Sie, dass es nur möglich ist, nicht recycelt zu werden.

Speicherzuweisungsmethode: Die von der virtuellen Maschine verwendete Methode wird dadurch bestimmt, ob der Speicher regelmäßig ist, und ob der Speicher regelmäßig ist, wird durch den Recycling-Algorithmus bestimmt.

Zeigerkollision: Angenommen, der gesamte zugewiesene Speicher wird auf der einen Seite und der freie Speicher auf der anderen Seite platziert. Ein Zeiger wird als Trennpunkt zwischen den beiden verwendet. Es muss nur der Zeiger bewegt werden. Diese Methode wird als Zeigerkollision bezeichnet. Diese Methode wird von Compact-Recyclern wie Serial und ParNew verwendet.

Freie Liste: Der zugewiesene Speicher und der freie Speicher in der virtuellen Maschine sind nicht regelmäßig und miteinander verflochten, daher müssen Sie eine A-Liste führen wird verwendet, um darzustellen, welcher Speicher verfügbar ist. Wenn Speicher zugewiesen werden muss, muss die Liste abgefragt werden, um die verfügbare Speichergröße zu ermitteln. Dieser Ansatz wird als freie Liste bezeichnet. Diese Methode wird von CMS und anderen Recyclern basierend auf dem Mark-Sweep-Algorithmus verwendet. Das Speicherlayout des

-Objekts in der virtuellen HotSpot-Maschine ist wie in der folgenden Tabelle dargestellt:

Java-Speicher und GC

In der Java-Spezifikation legt der Referenztyp nur einen Verweis auf ein Objekt fest, gibt jedoch nicht an, wie auf die referenzierten Daten zugegriffen werden soll. Daher gibt es unterschiedliche Zugriffsmethoden für verschiedene virtuelle Maschinen:

Verwenden von Handles: Reservieren Sie einen Bereich im Java-Heap als Handle-Pool, um Handles zu speichern In der Referenz wird neben dem Zeiger des Objektdatentyps auch die Adresse des Objekthandles gespeichert. Eine Referenz greift indirekt über ein Handle auf ein Objekt zu. Der Vorteil ist: Wenn sich das Objekt bewegt, müssen Sie nur den Zeiger im Rechteck ändern und die entsprechende Referenz muss nicht geändert werden.

Direkter Zugriff: Die Referenz speichert die Objektadresse, und Sie können dies tun Sie können über die Referenz Zugriffsdaten direkt darauf zugreifen. Die Datenobjekte in Java-Paaren enthalten Zeiger auf den Datentyp des Objekts, beispielsweise die oben erwähnten Typzeiger. Der Vorteil dieser Methode besteht darin, dass die Zugriffsgeschwindigkeit hoch ist und der Aufwand für die Zeigerpositionierung im Vergleich zur Verwendung von Handles eingespart wird. HotSpotVM verwendet diese Methode.

Die Abbildungen der beiden Verwendungsmethoden sind wie folgt: Bildquelle http://www.th7.cn/Program/java/201604/846729.shtml

Java-Speicher und GC

Garbage-Collection-Algorithmus

Es gibt zwei Algorithmen, um festzustellen, ob ein Objekt tot ist und nicht mehr verwendet werden kann:

Referenzzählalgorithmus: für ein Objekt, wie oft es tot ist Der referenzierte Wert erhöht sich um eins, der Zähler erhöht sich um 1, und wenn der Verweis ungültig wird, verringert er sich um 1. Wenn der Zähler 0 erreicht, gilt das Objekt als tot. Dieser Algorithmus zeichnet sich durch eine hohe Effizienz aus, es ist jedoch schwierig, das Problem der gegenseitigen Referenzen zwischen Objekten zu lösen. Dieser Algorithmus wird von der COM-Technologie von MS und Python usw. verwendet.

Algorithmus zur Erreichbarkeitsanalyse: Der Kern dieses Algorithmus besteht darin, von GC Roots auszugehen und alle referenzierten Objekte zu erkennen. Wenn zwischen einem Objekt und GC Roots keine Referenzkette besteht, gilt das Objekt als tot. Zur Verwendung dieses Algorithmus werden Java, C# usw. verwendet.

Zu den Objekten, die als GC-Roots verwendet werden können, gehören:

Objekte, auf die im Stapel der virtuellen Maschine verwiesen wird (lokale Variablentabelle im Stapelrahmen)

Referenziert durch statische Klassenattribute in Das Methodenbereichsobjekt

Objekt, auf das durch eine Konstante im Methodenbereich verwiesen wird

Objekt, auf das in der nativen Methode verwiesen wird

hat in Java vier Referenzstärken:

Starke Referenz: Starke Referenzen werden vom Garbage Collector niemals recycelt.

Weiche Referenzen: Das System stellt die SoftReference-Klasse bereit, um Objekte darzustellen, die noch vorhanden, aber nicht notwendig sind. Der Zeitpunkt des Recyclings besteht darin, solche Referenzen zu recyceln, wenn nach dem Recycling des Referenzobjekts nicht genügend Speicher vorhanden ist, OOM

Schwache Referenz: Diese Art von Referenz wird durch die Klasse WeakReference repräsentiert und kann nur bis zur nächsten Speicherbereinigung überleben. Wenn der Garbage Collector funktioniert, werden Objekte, die nur schwachen Referenzen zugeordnet sind, recycelt, unabhängig davon, ob der aktuelle Speicher ausreicht. Das heißt, solange GC auftritt, müssen schwache Referenzen recycelt werden. Der Unterschied zur Referenzkette, die GC Roots nicht mehr erreicht, besteht darin, dass auf diese Objekte weiterhin über schwache Referenzen zugegriffen werden kann, auf Objekte ohne Referenzketten jedoch nie wieder zugegriffen werden kann.

Virtuelle Referenz: Wird durch PhantomReference implementiert, was keinen Einfluss auf die Lebensdauer des Objekts hat. Die Bedeutung seiner Existenz besteht darin, eine Systembenachrichtigung zu erhalten, wenn das durch die virtuelle Referenz referenzierte Objekt recycelt wird.

Der GC-Workflow des Systems ist in der folgenden Abbildung dargestellt. Im Allgemeinen kann ein recyceltes Objekt den Markierungsprozess zweimal durchlaufen und sich möglicherweise in der Finalisierungsmethode selbst speichern, um ein Recycling zu vermeiden.

Java-Speicher und GC

Mehrere typische Garbage-Collection-Algorithmen:

Java-Speicher und GC

Spezifische Implementierungsdetails des Garbage-Collection-Algorithmus in HotSpot VM: Zur Genauigkeit Ergebnisse: Der GC muss während des Scanvorgangs alle Threads einfrieren. Die aktuelle Mainstream-Java-Virtualisierung verwendet genaue GC, das heißt, das System kennt den Datentyp der Daten an jedem Speicherort und verwendet eine Datenstruktur namens OopMap, um solche Zuordnungsdatensätze zu implementieren. Mit solchen Informationen weiß die virtuelle Maschine direkt, wo die Objektreferenzen gespeichert sind. Dadurch entfällt die Notwendigkeit, den Speicher einzeln zu überprüfen, und der GC-Scan wird beschleunigt. Jede Anweisung des Programms kann zu Änderungen in den Referenzbeziehungen oder Speicherdaten führen, was zu Änderungen in der OopMap führt. Wenn in diesem Fall für jede Anweisung entsprechende OopMap-Daten generiert werden, nehmen diese ziemlich viel Platz ein Das Konzept eines Sicherheitspunkts (SafePoint) besteht darin, dass der GC-Scan nur dann durchgeführt wird, wenn jeder Thread zu dem dem Thread entsprechenden Sicherheitspunkt ausgeführt wird, sodass nur die OopMap für die Anweisungen am Sicherheitspunkt generiert werden kann, wodurch die Anzahl verringert wird von OopMap. Bei der Auswahl sicherer Punkte sollten die umfassenden Auswirkungen der GC-Frequenz und der Systemleistung berücksichtigt werden. Im Allgemeinen sind Punkte wie Methodenaufrufe, Schleifensprünge und Ausnahmesprünge „durch die Eigenschaften gekennzeichnet, dass das Programm über einen längeren Zeitraum ausgeführt werden kann“. ausgewählt. Damit die Threads bis zu einem sicheren Punkt laufen und für das GC-Scannen angehalten werden können, gibt es zwei Methoden: präventive Unterbrechung und proaktive Unterbrechung. Hier gibt es ein weiteres Problem, wenn er auf einen Thread trifft, der sich im Ruhezustand befindet. Wenn er sich nicht an einem sicheren Punkt befindet, bedeutet dies, dass er niemals zum sicheren Punkt wechselt Es wurde auch eine sichere Region (SafeRegion) vorgeschlagen. Das heißt, die Punkte in diesem Bereich sind sichere Punkte. Nachdem der Thread den sicheren Punkt betreten hat, markiert er, dass er den sicheren Bereich betreten hat, und muss warten, bis der GC abgeschlossen ist, bevor er den sicheren Bereich verlässt.

Jeder Garbage Collector:

Java-Speicher und GC

Einige der häufigsten Speicherzuweisungsregeln:

Objektprioritätszuweisung Im Eden-Bereich: Wenn der Speicher im Eden-Bereich nicht ausreicht, initiiert das System einen schnelleren Minor GC

Große Objekte gelangen direkt in die alte Generation: Für große Objekte wie lange Arrays und Zeichenfolgen gilt dies direkt in den Altgenerationsbereich verlegte Zuteilung. Daher verursachen große Objekte mit kurzen Lebenszyklen wahrscheinlich GC und sollten so weit wie möglich vermieden werden.

Langfristig überlebende Objekte werden in die alte Generation aufgenommen: Wenn ein Objekt mehrere Minor GCs im Survivor-Bereich überlebt, standardmäßig 15 Mal, wird es in die alte Generation verschoben.

Dynamische Bestimmung des Objektalters: Dieser Artikel wird mit dem vorherigen kombiniert. Wenn die Summe der Größen aller gleichaltrigen Objekte im Survivor die Hälfte des Survivor überschreitet, werden Objekte, deren Alter größer als oder ist Dieses Alter wird in den Bereich der alten Generation verschoben. Sie müssen nicht 15 Mal warten.

Platzzuweisungsgarantie: Kopiersammlungsalgorithmus für die neue Generation. Wenn die Parameter zulässig sind und nach der Ausführung von Minor GC nicht alle überlebenden Objekte im Survivor platziert werden können, werden viele Objekte direkt im Bereich der alten Generation platziert. Wenn in der alten Generation nicht genügend Speicherplatz vorhanden ist, wird ein vollständiger GC durchgeführt, um mehr Speicherplatz zu erhalten


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage