In diesem Kapitel werden wir sehen, wie JavaScript seinen Speicher verwaltet. JavaScript ist eine einzigartige Sprache, sie ist in der Lage, Speicher automatisch zu allokieren, sobald Objekte erstellt werden und ihn freizugeben, wenn sie nicht mehr verwendet werden. Im Gegensatz dazu erfordern Low-Level-Sprachen die manuelle Bestimmung, an welchem Punkt im Programm der allokierte Speicher nicht mehr benötigt wird und ihn freizugeben. Lasst uns also sehen, was in einer High-Level-Sprache wie JavaScript passiert, wenn du nichts mehr benötigst. Wie findet es die JavaScript-Engine heraus und räumt es auf.
Das Primäre Konzept
Erreichbarkeit ist das primäre Konzept des JavaScript-Speichermanagements. Die Werte, die zugänglich und nutzbar sind, werden als erreichbar bezeichnet. Unten findest du die Gruppe der grundsätzlich erreichbaren Werte:
- Lokale Variablen und die aktuellen Funktionsparameter.
- Parameter und Variablen für andere Funktionen auf der aktuellen Kette verschachtelter Aufrufe.
- Globale Variablen.
Die oben genannten Werte werden als Wurzeln bezeichnet.
Andere Werte gelten als erreichbar, sobald sie von einer Wurzel aus durch eine Kette von Referenzen oder eine einzelne Referenz erreichbar sind.
Betrachten wir ein Objekt in einer lokalen Variable. Wenn dieses Objekt eine Eigenschaft hat, die ein anderes Objekt referenziert, wird dieses Objekt als erreichbar bezeichnet. Die Referenzen sind ebenfalls erreichbar.
In JavaScript gibt es einen Hintergrundprozess, der als Garbage-Sammler bezeichnet wird. Er ist in der Lage, alle Objekte zu überwachen und diejenigen zu entfernen, die unerreichbar geworden sind.
Für ein besseres Verständnis, sieh dir das Beispiel unten an:
Wie man sehen kann, wird die Objektreferenz durch den Pfeil dargestellt. Die globale Variable "book" verweist auf das Objekt. Die "name" Eigenschaft speichert selbst eine Primitive.
Wird der buch Wert überschrieben, geht die Referenz verloren, wie unten gezeigt:
Das Objekt wird also unerreichbar. Der Garbage Collector entsorgt die Daten und gibt den Speicher frei.
Ein Fall von zwei Referenzen
In diesem Abschnitt betrachten wir, dass die Referenz von book auf language kopiert wurde, wie folgt:
Jetzt sieht das Gleiche so aus:
Das Objekt ist weiterhin über die globale Variable sprache erreichbar. Es ist im Speicher. Nach dem Überschreiben von sprache, kann es gelöscht werden.
Interne Algorithmen
Der Hauptalgorithmus des Garbage-Sammlung ist als “Mark-and-Sweep” bekannt. Regelmäßig werden einige Schritte der Garbage-Sammlung ausgeführt. Hier sind sie:
- Der Sammler nimmt Wurzeln und Merkmale und speichert sie.
- Danach besucht er und kennzeichnet alle Referenzen von ihnen.
- Der nächste Schritt besteht darin, die markierten Objekte zu besuchen und ihre Referenzen zu markieren. Es ist nicht möglich, das gleiche Objekt zweimal zu besuchen, da alle besuchten Objekte in Erinnerung behalten werden.
- Der Prozess geht so lange weiter, bis jede erreichbare Referenz besucht wurde.
- Alle Objekte außer den Marktobjekten werden gelöscht.
Und schließlich werden die Objekte, die während des obigen Prozesses nicht besucht werden konnten, als unerreichbar betrachtet und werden entfernt.
Der beschriebene Prozess der Garbage-Sammlung funktioniert also ordnungsgemäß. Aber JavaScript beinhaltet verschiedene Optimierungen, um sie noch besser und schneller arbeiten zu lassen. Zu diesen Optimierungen gehören Generations-Sammlung, Inkremental-Sammlung und Idle-Zeit-Sammlung.
Zusammenfassung
Die Müllsammlung ist ein Prozess, der automatisch implementiert wird. Sie kann weder erzwungen noch irgendwie verhindert werden.
Objekte können im Speicher behalten werden, solange sie erreichbar sind.
Es ist wichtig zu wissen, dass Referenziertwerden nicht dasselbe ist wie Erreichbarsein. Moderne Motoren führen fortgeschrittene Algorithmen der Müllsammlung aus.
Quizzeit: Testen Sie Ihre Fähigkeiten!
Sind Sie bereit, das Gelernte herauszufordern? Tauchen Sie ein in unsere interaktiven Quizze für ein tieferes Verständnis und eine unterhaltsame Art, Ihr Wissen zu festigen.