Das grundlegendste Ziel der automatischen Speicherverwaltung des Java-Technologiesystems besteht darin, zwei Probleme automatisch zu lösen: automatisches Zuweisen von Speicher zu Objekten und automatisches Recycling des den Objekten zugewiesenen Speichers. .
1. Übersicht
Konzeptionell sollte die Speicherzuordnung von Objekten auf dem Heap zugewiesen werden (tatsächlich kann sie nach der Just-in-Time-Kompilierung auch in Skalare zerlegt werden). ) Typ und indirekt auf dem Stapel zugewiesen). Beim klassischen Generationsdesign werden neue Objekte normalerweise in der jungen Generation zugewiesen. In seltenen Fällen (z. B. wenn die Objektgröße einen bestimmten Schwellenwert überschreitet) können sie auch direkt in der alten Generation zugewiesen werden. Die Regeln für die Objektzuordnung sind nicht festgelegt. Die „Java Virtual Machine Specification“ legt die Erstellungs- und Speicherdetails neuer Objekte nicht fest. Dies hängt davon ab, welchen Garbage Collector die virtuelle Maschine gerade verwendet und welche speicherbezogenen Funktionen in der virtuellen Maschine vorhanden sind . Parametereinstellungen.
In den meisten Fällen werden Objekte im Eden-Bereich der neuen Generation zugewiesen. Wenn im Eden-Bereich nicht genügend Speicherplatz für die Zuweisung vorhanden ist, initiiert die virtuelle Maschine einen Minor GC.
1. Wenn im Eden-Bereich genügend Platz vorhanden ist
Parameter der virtuellen Maschine
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
Parameterbeschreibung
Versuchen Sie es Um drei Objekte mit einer Größe von 2 MB und einem Objekt mit einer Größe von 4 MB zuzuweisen, begrenzen die drei Parameter -Xms20M, -Xmx20M und -Xmn10M die Java-Heap-Größe auf 20 MB, was der neuen Generation nicht erweiterbar ist Die restlichen 10 MB werden der neuen Generation zugewiesen. -XX: Survivor-Ratio=8 bestimmt, dass das Raumverhältnis zwischen dem Eden-Bereich und einem Survivor-Bereich in der neuen Generation 8:1 beträgt.
package com.xiao.test.Test; public class test { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] byte1,byte2,byte3; byte1 = new byte[2 * _1MB]; byte2 = new byte[2 * _1MB]; byte3 = new byte[2 * _1MB]; } }
2. Die Situation, in der im Eden-Bereich nicht genügend Platz vorhanden ist
Die Parameter der virtuellen Maschine sind gleich
package com.xiao.test.Test; public class test { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] byte1,byte2,byte3,byte4; byte1 = new byte[2 * _1MB]; byte2 = new byte[2 * _1MB]; byte3 = new byte[2 * _1MB]; byte4 = new byte[3 * _1MB]; } }
Große Objekte beziehen sich auf Java-Objekte, die viel kontinuierlichen Speicherplatz benötigen. Die typischsten großen Objekte sind lange Zeichenfolgen oder Arrays mit einer großen Anzahl von Elementen.
2. Gründe, warum große Objekte in Java Virtual Machines vermieden werden sollten
Bei der Zuweisung von Speicherplatz kann es leicht dazu kommen, dass die Speicherbereinigung im Voraus ausgelöst wird, wenn offensichtlich viel vorhanden ist Platz im Speicher, um ausreichend Platz zum Platzieren zu erhalten. Beim Kopieren von Objekten bedeuten große Objekte einen hohen Speicheraufwand für das Kopieren.
3. Der Vorteil großer Objekte, die direkt in die alte Generation gelangen
Vermeiden Sie das Hin- und Herkopieren zwischen dem Eden-Bereich und den beiden Survivor-Bereichen, was zu einer großen Menge an Speicher führt Kopiervorgänge (HotSpot virtuelle Maschine Der Parameter -XX: PretenureSizeThreshold wird bereitgestellt und gibt an, dass Objekte, die größer als der eingestellte Wert sind, direkt in der alten Generation zugewiesen werden.)
(3) Langfristig überlebende Objekte erreichen das Alter
Beim Recycling von Speicher müssen Sie entscheiden können, welche überlebenden Objekte in die neue Generation und welche überlebende Objekte in die alte Generation eingefügt werden sollen. Dazu definiert die virtuelle Maschine für jedes Objekt einen Objektalterszähler (Age), der im Objektheader gespeichert wird.
2. Der Prozess der Objektalterung und Beförderung zur alten Generation
Objekte werden normalerweise im Eden-Bereich geboren, wenn sie nach dem ersten Minor GC noch überleben kann Survivor sein. Wenn dies berücksichtigt wird, wird das Objekt in den Survivor-Bereich verschoben und sein Objektalter wird auf 1 Jahr gesetzt. Jedes Mal, wenn ein Objekt einen Minor GC im Survivor-Bereich überlebt, erhöht sich sein Alter um 1 Jahr. Wenn sein Alter ein bestimmtes Alter erreicht (Standard ist 15), wird es in die alte Generation befördert. Der Altersschwellenwert für ein Objekt, das auf die alte Generation heraufgestuft werden soll, kann über den Parameter -XX: MaxTenuringThreshold festgelegt werden.
3. Der Grund, warum langlebige Objekte in die alte Generation eintreten werden
Wir alle wissen, dass der Garbage-Collection-Algorithmus der neuen Generation ein Mark-Copy-Algorithmus ist Die langlebigen Objekte sind immer noch vorhanden. Wenn sie in der neuen Generation gespeichert werden, entsteht das Problem eines erhöhten Kopieraufwands. Daher legen wir Objekte, die größer als ein bestimmter Altersschwellenwert sind, in die alte Generation ein, wodurch der Druck auf die neue Generation bei der Speicherbereinigung verringert werden kann.
(4), Dynamische Bestimmung des Objektalters
(5), Platzzuteilungsgarantie
Bevor Minor GC auftritt, muss die virtuelle Maschine zunächst prüfen, ob der maximal verfügbare kontinuierliche Speicherplatz in der alten Generation größer ist als der Gesamtspeicherplatz aller Objekte in der neuen Generation. Wenn diese Bedingung zutrifft, kann dies diesmal der Minor GC sein garantiert sicher. Wenn dies nicht der Fall ist, prüft die virtuelle Maschine zunächst, ob der Einstellungswert des Parameters -XX: HandlePromotionFailure einen Garantiefehler zulässt. Wenn dies zulässig ist, prüft sie weiterhin, ob der maximal verfügbare kontinuierliche Speicherplatz in der alten Generation größer ist die durchschnittliche Größe von Objekten, die zur alten Generation heraufgestuft werden, wird ein kleinerer GC versucht, obwohl der kleinere GC dieses Mal riskant ist, wenn er kleiner ist oder die Einstellung -XX: HandlePromotionFailure kein Risiko zulässt. dann wird stattdessen eine vollständige GC durchgeführt.
2. Was ist das Risiko eines „Abenteuers“? Wie bereits erwähnt, verwendet die neue Generation einen Kopiersammlungsalgorithmus, aber für die Speichernutzung wird nur einer der Survivor-Speicherplätze als rotierende Sicherung verwendet, wenn also eine große Anzahl vorhanden ist Die Anzahl der Objekte erscheint im Minor. Die Situation, dass nach GC noch überlebt wird – der extremste Fall ist, dass alle Objekte in der neuen Generation nach dem Speicherrecycling überleben und der alten Generation zugewiesen und garantiert werden müssen, und Objekte, die von der nicht aufgenommen werden können Hinterbliebene werden direkt an die alte Generation geschickt. Dies ist vergleichbar mit Kreditgarantien im Leben. Um eine solche Garantie in der alten Generation zu gewährleisten, wird davon ausgegangen, dass die alte Generation selbst noch über verbleibenden Platz für die Unterbringung dieser Objekte verfügt. Wie viele Objekte dieses Recycling jedoch überleben werden, kann nicht genau bekannt sein, bevor das Speicherrecycling tatsächlich abgeschlossen ist kann nur die durchschnittliche Größe der Objektkapazität, die bei jedem vorherigen Recycling zur alten Generation befördert wurde, als Erfahrungswert verwenden. Es wird mit dem verbleibenden Speicherplatz in der alten Generation verglichen, um zu entscheiden, ob eine vollständige GC durchgeführt werden soll, um mehr Speicherplatz freizugeben die alte Generation.
3. Müssen wir die Garantie öffnen?
Der Vergleich mit dem historischen Durchschnitt ist eigentlich immer noch eine Lösung, die auf Wahrscheinlichkeitswetten basiert. Das heißt, wenn die Anzahl der Objekte nach dem Überleben eines bestimmten Minor GC plötzlich ansteigt, was viel höher ist als der historische Durchschnitt, wird dies immer noch dazu führen die Garantie scheitert. Wenn die Garantie fehlschlägt, müssen Sie Full GC ehrlich neu starten, sodass die Pausenzeit sehr lang sein wird. Obwohl der Kreis am größten ist, wenn die Garantie fehlschlägt, ist der Schalter -XX: HandlePromotionFailure normalerweise aktiviert, um zu vermeiden, dass die vollständige GC zu häufig erfolgt.
Das obige ist der detaillierte Inhalt vonBeispielanalyse von Speicherzuweisungs- und Recyclingstrategien in einer Java Virtual Machine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!