Was ist der Java Garbage Collector?
Der Java Garbage Collector ist eines der drei wichtigen Module der Java Virtual Machine (JVM) (die anderen beiden sind der Interpreter und das Multithreading). Die Anwendung bietet Funktionen zur automatischen Speicherzuweisung (Memory Allocation) und zum automatischen Recycling (Garbage Collect). Beide Vorgänge erfolgen auf dem Java-Heap (einem Speicherblock). Wenn zu einem bestimmten Zeitpunkt ein Objekt mehr als eine Referenz (Rreference) hat, die auf es verweist, dann ist das Objekt lebendig (Live), andernfalls ist es tot (Dead) und wird als Müll betrachtet und kann recycelt und wiederverwendet werden der Müllsammler. Garbage-Collection-Vorgänge verbrauchen Ressourcen wie CPU, Threads und Zeit, daher ist es leicht zu verstehen, dass Garbage-Collection-Vorgänge nicht in Echtzeit erfolgen (Objekte werden sofort nach dem Tod freigegeben, wenn der Speicher verbraucht ist oder ein bestimmter Indikator erreicht ist). (Schwellenwert, der verwendete Speicher entspricht dem Gesamtspeicherverhältnis, z. B. 0,75), der Garbage Collection-Vorgang wird ausgelöst. Es gibt eine Ausnahme für den Tod eines Objekts. Auch wenn ein Objekt vom Typ java.lang.Thread keinen Verweis hat, wird es nicht recycelt, solange der Thread noch läuft.
Recyclingmechanismus
Laut statistischer Analyse haben die meisten Objekte in Java (einschließlich einiger anderer Hochsprachen) einen kurzen Lebenszyklus, sodass der Java-Speicher in Generationen verwaltet wird. Der Zweck der Generationsgenerierung besteht lediglich darin, unterschiedliche Verwaltungsstrategien (Algorithmen) für Speicherblöcke verschiedener Generationen zu verwenden, um die Leistung zu maximieren. Im Vergleich zur alten Generation ist die junge Generation meist deutlich kleiner, die Recyclinghäufigkeit hoch und die Geschwindigkeit hoch. Die alte Generation hat eine geringe Recyclinghäufigkeit und dauert lange. Der Speicher wird in der jungen Generation zugewiesen. Objekte der jungen Generation, die nach mehreren Recyclingzyklen noch überleben, werden automatisch zur alten Generation befördert.
Entwurfsentscheidungen
Entwurfsentscheidungen wirken sich auf die Schwierigkeit der Implementierung des JVM-Garbage Collectors und die Leistungsindikatoren der JVM aus, die für verschiedene Szenarien gelten. Beschreibt die Stilmerkmale des Recycling-Algorithmus.
Single-Threaded Serial Recycling VS Multithreaded Parallel Recycling
Die Frage ist, ob der Recyclingvorgang selbst Multithreaded ist. Die Vorteile des Single-Thread-Recyclings bestehen darin, dass es einfach und leicht zu implementieren ist, weniger fragmentiert ist und für Single-Core-Maschinen geeignet ist. Das parallele Multithread-Recycling kann die CPU-Ressourcen auf Multi-Core-Maschinen voll ausnutzen, die Recyclingzeit verkürzen und die Produktivität steigern. Der Nachteil besteht darin, dass es kompliziert ist und einige Fragmente möglicherweise nicht recycelt werden.
Anwendungsthread während des Recyclingvorgangs anhalten VS Recycling und Anwendung werden gleichzeitig durchgeführt
Die Frage, ob der Anwendungsthread während des Recyclingvorgangs angehalten werden soll. Die Vorteile des Anhaltens des Anwendungsthreads sind Einfachheit, Genauigkeit, relativ saubere Reinigung und kurze Reinigungszeit (CPU-Ressourcen sind exklusiv). Der Nachteil besteht darin, dass das Anhalten des Anwendungsthreads zu einer Verlängerung der Anwendungsreaktionszeit während des Speicherbereinigungszyklus führt. und die Echtzeitleistung ist sehr hoch. Das System ist relativ empfindlich. Der Vorteil der parallelen Verarbeitung von Recycling- und Anwendungsthreads besteht darin, dass die Antwortzeit der Anwendung relativ stabil ist. Die Nachteile bestehen jedoch darin, dass die Implementierung schwierig ist, die Reinigungshäufigkeit hoch ist und möglicherweise Fragmente vorhanden sind.
Die freigegebenen Speichersegmente nicht zusammenführen VS. Die freigegebenen Speichersegmente zusammenführen VS. Die Live-Segmente an einen neuen Ort kopieren
Diese drei Optionen beschreiben, wie Fragmente mit toten Speicherblöcken verwaltet werden. Tote Speicherfragmente sind normalerweise über den gesamten Heap verteilt. Wenn sie nicht verwaltet werden, kommt es zu einer langsamen Speicherzuweisung, da kleine Fragmente zu einer Verschwendung von Speicher führen zusammenhängende Speichersegmente). Es gibt zwei Möglichkeiten zur Verwaltung: Verschieben Sie den Live-Speicher an ein Ende des Speicherblocks und zeichnen Sie die Startposition des verfügbaren Speichers auf, oder kopieren Sie einfach den Live-Speicher in einen neuen Speicherbereich und lassen Sie den ursprünglichen Speicherblock leer.
Leistungskennzahlen
①, Produktivität (Durchsatz)
Innerhalb eines längeren Zeitraums (ein langer Zeitraum ist sinnvoll) der Anteil der nicht recycelten Produkte Zeit zur Gesamtzeit. Misst die Betriebseffizienz des Systems.
②, Garbage Collection Overhead (Garbage Collection Overhead)
Das Verhältnis der Recyclingzeit zur Gesamtzeit in einem längeren Zeitraum. Entspricht der Produktivität, die sich auf 100 % summiert.
③, Pausenzeit
Wenn die Java Virtual Machine Müll recycelt, unterbrechen einige Algorithmen die Ausführung aller Anwendungsthreads. In einigen Systemen kann dies empfindlich sein das Pausenintervall.
④, Häufigkeit der Sammlung
Wie lange dauert es durchschnittlich, bis Recyclingvorgänge stattfinden?
⑤. Größe des belegten Speichers (Footprint)
Wie zum Beispiel die Größe des Heaps.
⑥, Echtzeit (Promptheit)
Wie lange es dauert, bis der vom Objekt belegte Speicher seit dem Tod des Objekts wiederverwendet wird.
Arten der Müllabfuhr
Alle Sammelarten basieren auf Generationentechnologie. Die virtuelle Java-HotSpot-Maschine enthält drei Generationen: Junge Generation, Alte Generation und Permanente Generation.
①Permanente Generierung
speichert Klassen, Methoden und deren Beschreibungsinformationen. Sie können die Anfangsgröße und den Maximalwert über die beiden optionalen Optionen -XX:PermSize=64m und -XX:MaxPermSize=128m angeben. Normalerweise müssen wir diesen Parameter nicht anpassen. Wenn jedoch zu viele Klassen geladen sind und dies nicht ausreicht, passen Sie einfach den Maximalwert an.
②Alte Generation
Speichert hauptsächlich Objekte in der jungen Generation, die mehrere Recyclingzyklen überstehen und aktualisiert werden. Natürlich können sie bei einigen großen Speicherzuweisungen auch direkt der permanenten Generation zugewiesen werden (ein extremes Beispiel ist, dass die junge Generation nicht gespeichert werden kann). überhaupt).
③Junge Generation
Die überwiegende Mehrheit der Speicherzuweisungs- und Recyclingaktionen findet in der jungen Generation statt. Wie in der folgenden Abbildung dargestellt, ist die junge Generation in drei Bereiche unterteilt, den ursprünglichen Bereich (Eden) und zwei kleine Überlebensbereiche (Survivor). Die beiden Überlebensbereiche sind entsprechend ihrer Funktion in Von und Bis unterteilt. Die meisten Objekte werden im ursprünglichen Bereich zugewiesen, und Objekte, die mehr als einen Speicherbereinigungsvorgang überleben, werden im Überlebensbereich platziert.
Serieller Collector
Einzelner Thread führt den Recyclingvorgang durch und unterbricht die Ausführung aller Anwendungsthreads während des Recyclings im Client-Modus. Der Standardkollektor ist erzwungen muss über die Befehlszeilenoption -XX:+UseSerialGC angegeben werden.
① Recycling-Algorithmus der jungen Generation (Minor Collection)
Verschieben Sie die überlebenden Objekte im Eden-Bereich in den To-Bereich. Wenn der To-Bereich nicht hineinpasst, verschieben Sie ihn direkt dorthin Die alten Generationen werden in den To-Bereich verschoben im Von-Bereich wird auf die alte Generation aktualisiert. Nach Abschluss des Recyclings sind sowohl der Eden- als auch der From-Bereich leer. Zu diesem Zeitpunkt werden die Funktionen von From und To vertauscht, From wird To und To wird From. Vor jeder Recycling-Runde ist To leer. Designauswahl ist Kopieren.
②Recycling-Algorithmus der alten Generation (vollständige Sammlung)
Das Recycling der alten Generation ist in drei Schritte unterteilt: Markieren, Sweepen und Kompaktieren. Die Markierungsphase markiert alle lebenden Objekte, die Löschphase gibt alle toten Objekte frei und die Zusammenführungsphase führt alle lebenden Objekte im vorderen Teil der alten Generation zusammen und lässt alle freien Segmente hinten. Die Designauswahl wird zusammengeführt, um die Speicherfragmentierung zu reduzieren.
Parallel Collector
Verwenden Sie mehrere Threads, um die Garbage Collection gleichzeitig durchzuführen. In einer Multi-Core-Umgebung können Sie die CPU-Ressourcen voll ausnutzen, die Recyclingzeit reduzieren und Erhöhen Sie die JVM-Produktivität. Server Der Standardkollektor im Modus. Wie beim seriellen Collector wird die Ausführung aller Anwendungsthreads während der Sammlung angehalten. Wird durch die Befehlszeilenoption -XX:+UseParallelGC erzwungen.
① Sammelalgorithmus der jungen Generation (Minor Collection)
Verwenden Sie mehrere Threads, um Müll zu sammeln, und der Algorithmus jedes Threads ist der gleiche wie der des seriellen Sammlers.
②Recycling-Algorithmus der alten Generation (vollständige Sammlung)
Die alte Generation ist immer noch Single-Threaded, genau wie der serielle Sammler.
Parallel Compacting Collection
Die Sammlung der jungen Generation und der alten Generation wird durch Multithreading verarbeitet. Durch die Befehlsoption -XX:+UseParallelOldGC angegeben, kann -XX:ParallelGCThreads=3 die Anzahl der Threads angeben, die am parallelen Recycling teilnehmen. Wie beim seriellen Collector wird die Ausführung aller Anwendungsthreads während der Sammlung angehalten. Im Vergleich zum Parallelkollektor ist die Sammelzeit der alten Generation kürzer, wodurch das Pausenzeitintervall (Pausenzeit) verkürzt wird. Wird durch die Befehlszeilenoption –XX:+UseParallelOldGC erzwungen.
①Der Sammlungsalgorithmus der jungen Generation (Minor Collection)
Dasselbe wie der Parallelkollektor (Parallel Collector)
②Der Sammlungsalgorithmus der alten Generation ( Vollständige Sammlung) )
Die alte Generation ist in drei Schritte unterteilt: Markieren, Statistiken und Zusammenführen. Die Idee der Aufteilung wird hier verwendet, um die alte Generation in viele Regionen fester Größe aufzuteilen. In der Markierungsphase werden alle überlebenden Objekte in N Gruppen eingeteilt (dies sollte der Anzahl der Recycling-Threads entsprechen). Jeder Thread ist unabhängig für seine eigene Gruppe verantwortlich und markiert den Standort der überlebenden Objekte und die Informationen zur Überlebensrate die Region (Region), markiert als Parallel. In der Statistikphase wird die Überlebensrate jeder Region gezählt. Grundsätzlich ist die Überlebensrate vorne höher. Finden Sie die Startposition, die es wert ist, zusammengeführt zu werden (Regionen, in denen die meisten Objekte leben, sind es nicht wert, zusammengeführt zu werden). Die Statistikphase ist seriell (Single-Threaded). In der Zusammenführungsphase kopieren Multithreads basierend auf den Informationen in der statistischen Phase die überlebenden Objekte parallel von einer Region (Region) in eine andere Region (Region).
Concurrent Mark-Sweep Collector
Auch als Low-Latency Collector bekannt, verwendet er verschiedene Mittel, um Anwendungen zu erstellen. Das Programm wird für die kürzeste Zeit angehalten. Recyclingvorgänge werden grundsätzlich gleichzeitig mit der Anwendung durchgeführt, ohne Zusammenführungs- und Kopiervorgänge. Über die Befehlszeile -XX:+UseConcMarkSweepGC angegeben, können Sie auch den inkrementellen Recyclingmodus -XX:+UseConcMarkSweepGC in einem Single-Core- oder Dual-Core-System angeben. Unter inkrementellem Recycling versteht man die Aufteilung des Recyclingvorgangs in mehrere Fragmente, die Freigabe von CPU-Ressourcen für die Anwendung nach der Ausführung eines Fragments und die Fortsetzung des Recyclings des letzten Ergebnisses zu einem bestimmten Zeitpunkt in der Zukunft. Ziel ist es auch, Verzögerungen zu reduzieren.
①Der Sammlungsalgorithmus der jungen Generation (Minor Collection)
Dasselbe wie der Parallelkollektor (Parallel Collector)
②Der Sammlungsalgorithmus der alten Generation ( Vollständige Sammlung) )
ist in vier Schritte unterteilt: Initial Mark, Concurrent Mark, Remark und Concurrent Sweep. Beachten Sie insbesondere, dass es keinen Zusammenführungsvorgang gibt und es daher zu einer Fragmentierung kommt.
Initialisierungsphase: Halten Sie den Anwendungsthread an und finden Sie alle verbleibenden Objekte. Es dauert nur kurze Zeit und der Recycler verwendet einen einzelnen Thread.
Gleichzeitige Markierungsphase: Der Kollektor-Markierungsvorgang wird gleichzeitig mit der Anwendung ausgeführt, und der Kollektor verwendet einen einzelnen Thread, um lebende Objekte zu markieren.
Erneut markieren: Da während der gleichzeitigen Markierungsphase auch die Anwendung ausgeführt wird, können während dieses Vorgangs Objekte hinzugefügt oder geändert werden. Halten Sie den Anwendungsthread also erneut an, suchen Sie alle geänderten Objekte und verwenden Sie die Multithread-Markierung.
Gleichzeitige Bereinigung: Der Kollektor-Bereinigungsvorgang wird gleichzeitig mit der Anwendung ausgeführt, und der Kollektor verwendet einen einzelnen Thread, um tote Objekte zu bereinigen.
Java Garbage Collector Leistungsbewertungstool
①–XX:+PrintGCDetails und –XX:+PrintGCTimeStamps
Garbage Collection Startzeit, Dauer, freier Speicher jeder Generation und andere Informationen.
②jmap [options] pid
jamp 2043 Zeigt die im 2043-Prozess geladenen freigegebenen Objekte an. Normalerweise DLL-Dateien.
jmap -heap 2043 Zeigt die Konfigurationsinformationen und die Nutzung des Speicherheaps an.
jmap -permstat 2043 Überprüfen Sie den Ladestatus der permanenten Generation.
jmap -histo 2043 Überprüfen Sie das Laden und die Speichernutzung von Klassen.
③jstat [Optionen] pid
jstat -class 2043 Laden, Entladen, Speichernutzung der Klasse.
jstat -gc 2043 GC-Ausführungsstatus.
Postscript
Java bietet Funktionen zur automatischen Auswahl und automatischen Leistungsoptimierung. Bevor Sie den Garbage Collector optimieren, listen Sie zunächst die Leistungsindikatoren auf, die Sie beunruhigen, und teilen Sie der JVM über die Befehlszeile mit, welche Leistungsindikatoren Sie beunruhigen. Die JVM optimiert ihn automatisch. Wenn Sie nicht zufrieden sind, können Sie den Garbage Collector angeben . OutOfMemory wird normalerweise durch unzureichenden Heap-Speicher verursacht. Passen Sie einfach die Befehlszeilenoptionen -Xmx1024m und -XX:MaxPermSize=128m an.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.
Weitere verwandte Artikel zu den Methoden und Prinzipien des Java Garbage Collectors finden Sie auf der chinesischen PHP-Website!