JavaRush /Java-Blog /Random-DE /Mehr über den Garbage Collector in Java

Mehr über den Garbage Collector in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! In der letzten Vorlesung haben wir zunächst den eingebauten Mechanismus der Java-Sprache kennengelernt – den Garbage Collector. Es arbeitet im Hintergrund, während Ihr Programm ausgeführt wird, und sammelt unnötig gewordene Objekte, die später gelöscht werden. Auf diese Weise wird Speicherplatz für die zukünftige Erstellung neuer Objekte frei. In diesem Vortrag werden wir uns das Funktionsprinzip genauer ansehen. Wie und ab welchem ​​Punkt wird beispielsweise ein Objekt überflüssig? Und woher weiß der Müllsammler davon? Wir werden diese Fragen beantworten :) Unser Vortrag ist eher ein Überblick: Dieser Stoff muss nicht auswendig gelernt werden. Es soll Ihren Horizont in Bezug auf die Arbeit des Gedächtnisses und des Garbage Collectors erweitern, sodass es ausreicht, es zu lesen und selbst etwas Neues zu lernen :) Auf geht's! Als Erstes müssen Sie bedenken, dass der Garbage Collector parallel zu Ihrem Programm läuft . Es gehört nicht dazu und funktioniert separat: Um dies zu beschreiben, haben wir in der letzten Vorlesung eine Analogie mit einem Roboterstaubsauger gegeben. Tatsächlich war dies nicht immer der Fall. Bisher war der Garbage Collector so konzipiert, dass er im selben Thread wie Ihr Programm funktionierte. Und nach einem Zeitplan begann es alle paar Minuten zu prüfen, ob unnötige Objekte im Programm vorhanden waren. Das Problem bestand darin, dass das Programm während dieser Überprüfung und Speicherbereinigung einfror und nicht ausgeführt wurde. Stellen Sie sich vor, Sie sitzen in einem Büro und arbeiten. Doch dann kommt eine Putzfrau und muss die Böden im Zimmer waschen. Sie wirft dich fünf Minuten lang hinter dem Computer hervor und du wartest, bis sie mit dem Putzen fertig ist. Während dieser Zeit können Sie nicht arbeiten. In etwa funktionierten Garbage Collectors früher :) Später wurde dieser Mechanismus geändert, und jetzt arbeitet der Garbage Collector im Hintergrund, ohne die Arbeit des Programms selbst zu verlangsamen. Sie wissen bereits, dass ein Objekt stirbt, wenn keine Referenzen mehr darauf vorhanden sind. Der Garbage Collector zählt jedoch keine Verweise auf . Erstens kann es ziemlich lang sein. Zweitens ist es nicht sehr effektiv. Schließlich können Objekte aufeinander verweisen! Mehr zum Garbage Collector - 2Die Abbildung zeigt ein Beispiel, bei dem drei Objekte aufeinander verweisen, aber kein anderes Objekt darauf verweist. Das heißt, sie werden nicht benötigt, damit der Rest des Programms funktioniert. Wenn der Garbage Collector einfach Referenzen zählen würde, würden alle diese drei Objekte verbleiben und keinen Speicher freigeben: Es gibt Referenzen auf sie! Es kann mit einem Raumschiff verglichen werden. Während des Fluges beschlossen die Astronauten, die Liste der zu reparierenden Ersatzteile zu überprüfen und fanden darunter ein Lenkrad und Pedale eines gewöhnlichen Autos. Sie werden hier offensichtlich nicht benötigt und nehmen zusätzlichen Platz ein. Obwohl diese Teile miteinander verbunden sind und einige Funktionen haben, sind sie im Rahmen des Betriebs des Raumfahrzeugs unnötiger Müll, den man besser loswerden sollte. Aus diesem Grund hat Java beschlossen, als Grundlage für die Garbage Collection keine Referenzen zu zählen, sondern Objekte in zwei Typen zu unterteilen – erreichbar und nicht erreichbar. Wie kann festgestellt werden, ob ein Objekt erreichbar ist? Alles Geniale ist einfach. Ein Objekt ist erreichbar, wenn es von einem anderen erreichbaren Objekt referenziert wird. Dadurch entsteht eine „Kette der Erreichbarkeit“. Es beginnt mit dem Start des Programms und dauert während der gesamten Laufzeit an. Es sieht ungefähr so ​​aus: Mehr zum Garbage Collector - 4Der Pfeil in der Abbildung zeigt den ausführenden Code unseres Programms an. Im Code, beispielsweise in der main()-Methode, werden Verweise auf Objekte erstellt. Diese Objekte können auf neue Objekte verweisen, diese auf weitere und so weiter. Es entsteht eine Kette von Objektgliedern . Wenn ein Objekt über diese Kette von Links zu einem „Root-Link“ erreicht werden kann, also zu einem Objekt, das direkt im ausführenden Code erstellt wird, gilt es als erreichbar. In unserem Bild sind sie blau markiert. Wenn jedoch ein Objekt aus dieser Kette herausgefallen ist, d. h. keine der Variablen im aktuell ausgeführten Code Verweise darauf enthält und es auch nicht möglich ist, es über die „Linkkette“ zu erreichen, gilt es als unerreichbar. In unserem Programm sind zwei solcher Objekte rot markiert. Bitte beachten Sie: Diese „roten“ Objekte sind miteinander verknüpft. Aber wie bereits erwähnt, führt der moderne Garbage Collector in Java keine Referenzzählung durch. Es bestimmt , ob ein Objekt erreichbar oder nicht erreichbar ist . Daher werden die beiden roten Objekte auf dem Bild zu seiner Beute. Schauen wir uns nun den gesamten Prozess von Anfang bis Ende an und sehen wir uns gleichzeitig an, wie der Speicher in Java funktioniert :) Alle Objekte in Java werden in einem speziellen Speicherbereich namens Heap gespeichert . Im Volksmund ist ein „Haufen“ ein Berg von Gegenständen, in dem alles durcheinander herumliegt. Aber der Heap in Java ist nicht so. Es hat eine sehr logische und vernünftige Struktur. Eines schönen Tages entdeckten Java-Programmierer, dass alle Objekte in ihren Programmen in zwei Typen unterteilt werden können – relativ gesehen einfache Objekte und „langlebige“ Objekte . „Langlebige“ Objekte sind solche, die viele Garbage Collections überstanden haben. Meistens bleiben sie bis zum Ende des Programms bestehen. Dadurch wurde der gemeinsame Heap, in dem alle erstellten Objekte gespeichert werden, in mehrere Teile aufgeteilt. Der erste Teil hat einen schönen Namen – Eden (biblisch „Garten Eden“). Das ist ein toller Name, denn hierhin gehen Objekte, nachdem sie erstellt wurden. In diesem Teil wird beim Schreiben Speicher für neue Objekte zugewiesennew. Es können viele Objekte erstellt werden, und wenn in diesem Bereich kein Platz mehr vorhanden ist, beginnt die erste, „schnelle“ Speicherbereinigung. Es muss gesagt werden, dass der Garbage Collector sehr intelligent ist und einen Arbeitsalgorithmus wählt, je nachdem, was sich mehr im Heap befindet – Müll oder Arbeitsobjekte. Wenn fast alle Objekte Müll sind, markiert der Collector die „lebenden“ Objekte und verschiebt sie in einen anderen Speicherbereich, woraufhin der aktuelle Bereich vollständig bereinigt wird. Wenn wenig Müll vorhanden ist und der Großteil davon mit lebenden Objekten belegt ist, markiert es den Müll, reinigt ihn und ordnet die verbleibenden Objekte. Wir sagten: „Der Sammler markiert die „lebenden“ Objekte und verschiebt sie an einen anderen Speicherort“, aber welchen? Der Speicherbereich, in den alle Objekte übertragen werden, die mindestens eine Garbage Collection überleben, wird Survival Space genannt . Survival Space wiederum ist in Generationen eingeteilt . Jedem Objekt wird eine Generation zugewiesen, die auf der Anzahl der Garbage Collections basiert, die es durchlaufen hat. Wenn es eine gibt, gehört sie zur „Generation 1“, wenn 5 – zur „Generation 5“. Gemeinsam bilden Eden und Survival Space einen Bereich namens Young Generation . Neben Young Generation gibt es im Heap einen weiteren Speicherbereich – Old Generation („alte Generation“). Dies sind die sehr langlebigen Objekte, die viele Müllsammlungen überstanden haben. Es ist rentabler, sie getrennt von allen anderen aufzubewahren. Und zwar erst, wenn der Old-Generation-Bereich voll ist, also Auch wenn das Programm so viele langlebige Objekte enthält, dass nicht genügend Speicher vorhanden ist, wird eine vollständige Garbage Collection durchgeführt. Es verarbeitet nicht nur einen Speicherbereich, sondern grundsätzlich alle von der Java-Maschine erstellten Objekte. Natürlich kostet es viel mehr Zeit und Ressourcen. Aus diesem Grund wurde beschlossen, langlebige Gegenstände getrennt aufzubewahren. Wenn in anderen Bereichen der Platz knapp wird, wird eine sogenannte „Rapid Garbage Collection“ durchgeführt. Es deckt nur einen Bereich ab und ist dadurch wirtschaftlicher und schneller. Am Ende, wenn selbst der Bereich für Hundertjährige bereits verstopft ist, kommt die Vollreinigung ins Spiel. Somit wird das „schwerste“ Werkzeug vom Monteur nur dann verwendet, wenn es nicht mehr benötigt wird. Schematisch sieht der Aufbau des Heaps und der Reinigung so aus: Mehr zum Garbage Collector - 5
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION