Ein Garbage Collector (GC) ist ein Speichermanager. Viele Programmiersprachen haben einen eingebauten GC. Diese Funktion weist den Speicher in einem Programm automatisch zu und hebt die Zuweisung auf. Es gibt gebundenen, ungenutzten Speicher frei, der Ihre Anwendung verlangsamt.

Das Schöne an einem GC ist, dass es Speicher für Sie freigibt, ohne dass Sie etwas tun müssen. Sie könnten es daher als ein so wichtiges Feature betrachten, dass Sie erwarten würden, dass jede Programmiersprache es hat. Leider ist dies nicht der Fall; sogar einer populären Sprache wie C kann ein GC fehlen.

Wie funktioniert die Speicherzuweisung?

Wenn Sie ein Programm in einer beliebigen Programmiersprache ausführen, reserviert Ihr Betriebssystem a Datenstapel im Speicher für dieses Programm. Dieses Programm besitzt und belegt diesen Datenstack, bis es die Ausführung abschließt. Wenn Ihr Programm mehr Speicher benötigt als verfügbar ist, kann es dynamisch mehr Speicher aus dem Speicherheap des Betriebssystems zuweisen.

instagram viewer

In der Programmierung repräsentiert eine Variable einen Speicherplatz. Wenn Sie also eine neue Variable deklarieren, weist die Programmiersprache Speicherplatz für diese Variable zu. Die Variable hat jetzt eine Speicheradresse. Bis Sie dieser Variablen einen Wert zuweisen, bleibt sie nicht initialisiert und enthält möglicherweise einen unbrauchbaren Wert.

Wenn eine Programmiersprache es Ihnen erlaubt, eine Variable zu deklarieren, ohne sie zu initialisieren, handelt es sich um eine dynamische Variable. Das bedeutet, dass sich der Wert, den Sie der Variablen zuweisen, im Laufe der Zeit ändern kann. Der Speicherort der Variablen bleibt jedoch unverändert, bis Sie die Zuweisung aufheben.

Wie funktioniert die Speicherfreigabe?

Die Speicherzuordnung ist für alle Programmiersprachen ein ähnlicher Prozess. Aber die entsprechende Methode der Speicherfreigabe weicht tendenziell ab. Es gibt zwei Arten von Speicherfreigabemethoden; manuell und automatisch. Ein GC führt eine automatische Freigabe durch.

Speicherfreigabe ohne Garbage Collector

Das Programmiersprache C verwendet keinen GC für die Speicherfreigabe. Daher müssen C-Programmierer Speicher manuell zuweisen und freigeben. C ermöglicht die dynamische Speicherzuweisung, wenn Sie zur Kompilierzeit nicht wissen, wie viel Speicher Sie zur Laufzeit verwenden werden.

Die Standardbibliothek (stdlib.h) enthält die Funktionen, die C verwendet, um die dynamische Speicherzuweisung zu verwalten. Zu diesen Funktionen gehören:

  • malloc(): weist eine bestimmte Speichergröße zu und gibt einen Zeiger auf diesen Speicher zurück. Wenn im Speicherpool des Betriebssystems nicht genügend Speicher verfügbar ist, wird null zurückgegeben.
  • free(): gibt einen bestimmten Speicherblock frei und gibt ihn an den Speicherpool des Betriebssystems zurück.

C-Programmbeispiel

#enthalten
#enthalten

inthauptsächlich()
{
int *ptr; // Zeiger deklarieren
int j; // Zähler deklarieren

// Speicherplatz für 200 Ganzzahlen zuweisen
ptr = (int *) malloc(200 * Größe von(int));

// ganzzahlige Werte in den zugewiesenen Speicher einfügen
// und jeden Wert auf der Konsole ausgeben
zum (j= 0; j< 200; j++)
{
ptr[j] = j;
Druckf("%d\t",ptr[j]);
}

// den zuvor zugewiesenen Speicher freigeben
frei(ptr);
Rückkehr0;
}

Der obige Code weist Speicher zum Speichern von 200 ganzzahligen Werten mithilfe von zu malloc() Funktion. Es verwendet einen Zeiger, um auf diesen Speicherplatz zuzugreifen, und speichert darin 200 ganzzahlige Werte. Der Zeiger gibt auch die an der Speicherstelle gespeicherten Daten an die Konsole aus. Schließlich gibt das Programm den zuvor zugewiesenen Speicher mithilfe von frei frei() Funktion.

Speicherfreigabe mit einem Garbage Collector

Mehrere gängige Programmiersprachen verwenden einen GC zur Speicherverwaltung. Dies erleichtert das Leben von Programmierern, die diese Sprachen verwenden, erheblich. C# und Java sind zwei Programmiersprachen, die einen GC verwenden.

Die C#-GC

In dem Programmiersprache C#verwaltet ein GC die Zuweisung und Freigabe von Speicheradressen. Daher muss sich ein C#-Programmierer keine Gedanken über die Freigabe eines Objekts machen, nachdem es seinen Zweck erfüllt hat.

Der C#-GC initialisiert für jeden neuen Prozess (oder Programm) einen Speicherpool, der als verwalteter Heap bezeichnet wird. Es ruft die VirtualAlloc() Funktion zum Zuweisen von Speicher und die VirtualFree() Funktion, um die Zuordnung aufzuheben. Das Beste daran ist, dass dies alles im Hintergrund geschieht, ohne dass Sie als Programmierer sich anstrengen müssen.

Der C# GC verfügt über eine Optimierungs-Engine, die verwendet wird, um zu entscheiden, wann Speicher freigegeben werden soll. Die Optimierungs-Engine untersucht den Anwendungsstamm, um festzustellen, welche Objekte nicht mehr verwendet werden. Dazu wird ein Diagramm erstellt, das sich vom Stamm der Anwendung bis zu verbundenen Objekten erstreckt. Dieser Stamm enthält statische Felder, lokale Variablen usw. Jedes Objekt, das nicht mit dem Anwendungsstamm verbunden ist, ist Müll.

Die GC-Optimierungs-Engine sammelt nicht nur selbst Speicher. Es muss zuerst eine neue Speicherallokationsanforderung erfolgen. Wenn das System über wenig verfügbaren Speicher verfügt, kommt die GC-Optimierungs-Engine ins Spiel.

Der Java-GC

In Java verwaltet ein GC auch die Zuweisung und Freigabe von Speicheradressen. Java hat jedoch derzeit vier verschiedene Arten von unterstützten Garbage Collectors:

  • Garbage-First (G1)
  • Seriell
  • Parallel
  • Z Garbage Collector (ZGC)

Der G1 Garbage Collector ist Javas Standard-GC seit der Veröffentlichung des Java Development Kit (JDK) 9. Java organisiert Daten in Objekten und speichert diese Objekte in einem Heap mit fester Größe. Der G1 Garbage Collector unterteilt den Heap in Heap-Bereiche gleicher Größe. Anschließend teilte es diese Heap-Regionen in zwei Abschnitte auf; junge und alte Generationen.

Jedes Mal, wenn Sie ein neues Objekt erstellen, erfolgt die Platzzuweisung für dieses Objekt in der jungen Generation. Unter Verwendung eines Alterungsprozesses kopiert der G1-Garbage Collector Objekte in den jungen Regionen in die alten Regionen. Es kopiert auch Objekte, die sich bereits in der alten Region befinden, in eine ältere Region.

Der G1-Garbage Collector führt dann den größten Teil seiner Speicherfreigabe in der jungen Generation durch und wagt sich gelegentlich in den Abschnitt der alten Generation.

Was sind die Vorteile eines Garbage Collectors?

Der Vorteil eines Garbage Collectors besteht darin, dass Sie beim Schreiben Ihres Codes nicht an die Speicherverwaltung denken müssen. So haben Sie Zeit, sich auf die anderen wichtigen Aspekte Ihrer Bewerbung zu konzentrieren. Einige andere Vorteile sind jedoch hervorzuheben.

Das Zurückgewinnen ungenutzter Objekte und das Freigeben von Arbeitsspeicher sorgen für eine sauberere Anwendungsausführung. Wenn Ihr Programm so schnell wie möglich Speicher freigibt, hat es einen geringeren Speicherbedarf und kann effizienter ausgeführt werden.

Die Garbage Collection reduziert Fehler im Zusammenhang mit der Speicherverwaltung wie Lecks und Zeigerfehler. Dies liegt daran, dass der Prozess nicht mehr vom Programmierer und seiner Fähigkeit, genauen Code zu schreiben, abhängig ist.