Eine Anleitung zur Garbage Collection in der Programmierung

Was ist Garbage Collection?

Im Allgemeinen ist Garbage Collection (GC) nichts anderes als das Sammeln oder Zurückgewinnen von Speicher, der Objekten zugewiesen wurde, aber derzeit in keinem Teil unseres Programms verwendet wird.

Lassen Sie uns näher darauf eingehen. Garbage Collection ist der Prozess, bei dem Programme versuchen, Speicherplatz freizugeben, der nicht mehr von Objekten verwendet wird.

Die Speicherbereinigung wird für jede Sprache unterschiedlich implementiert. In den meisten High-Level-Programmiersprachen ist eine Art Garbage Collection integriert. Low-Level-Programmiersprachen können die Garbage Collection über Bibliotheken hinzufügen.

Wie oben erwähnt, hat jede Programmiersprache ihre eigene Art, GC durchzuführen. Bei der C-Programmierung müssen Entwickler die Speicherzuweisung und Freigabe mithilfe der Funktionen malloc () und dealloc () sicherstellen. Aber im Fall von C # müssen sich Entwickler nicht um GC kümmern und es wird auch nicht empfohlen.

Wie erfolgt die Speicherzuweisung?

In C # erfolgt die Speicherzuweisung von Objekten in einem verwalteten Heap, für den CLR (Common Language Runtime) sorgt. Die Speicherzuweisung für den Heap erfolgt über die Win32-DLL im Betriebssystem und ähnlich in C.

In C werden Objekte jedoch überall dort gespeichert, wo freier Speicherplatz vorhanden ist, der der Größe des Objekts entspricht. Die Speicherzuordnung basiert auch auf Linkedlist-Konzepten. In C # erfolgt die Speicherzuordnung für den Heap nacheinander linear.

Jedes Mal, wenn ein neues Objekt erstellt wird, wird Speicher im Heap zugewiesen und der Zeiger wird zur nächsten Speicheradresse verschoben. Die Speicherzuweisung in C # ist schneller als in C. Dies liegt daran, dass in C der Speicher nach dem Objekt suchen und es zuordnen muss. Es wird also etwas länger dauern als C #.

Generationen in C # GC

Bei der .net-Programmierung hat der Heap drei Generationen, die als Generationen 0, 1 und 2 bezeichnet werden. Die Generation 0 wird zuerst gefüllt, wenn ein neues Objekt erstellt wird. Dann läuft der Garbage Collector, wenn Generation 0 gefüllt wird. Neu erstellte Objekte werden in Generation 0 platziert.

Während der Speicherbereinigung werden alle unerwünschten Objekte zerstört, sodass der Speicher freigegeben und komprimiert wird. GC kümmert sich darum, die Zeiger des freigegebenen Speichers zu zeigen, sobald GC auftritt.

Die Generationen 1 und 2 enthalten Objekte mit längeren Lebensdauern. GC für die Generationen 1 und 2 wird erst durchgeführt, wenn die Generationen 0 über genügend Speicher verfügen, um sie zuzuweisen.

Sie sollten GC nicht programmgesteuert aufrufen. Es ist gut, es alleine passieren zu lassen. GC erhält einen Anruf, wenn die Generation 0 gefüllt wird.

Vor- und Nachteile von GC

Die Speicherbereinigung ist ein Tool, das Programmierern Zeit spart. Zum Beispiel ersetzt es die Notwendigkeit von Funktionen wie malloc () und free (), die in C enthalten sind. Es kann auch dazu beitragen, Speicherlecks zu verhindern.

Der Nachteil der Speicherbereinigung besteht darin, dass sie sich negativ auf die Leistung auswirkt. GC muss regelmäßig durch das Programm laufen, Objektreferenzen überprüfen und den Speicher bereinigen. Dies beansprucht Ressourcen und erfordert häufig eine Pause des Programms.

Wann es zu tun ist

Wenn ein Objekt keine Referenzen hat (nicht mehr erreichbar ist), kann es zur Speicherbereinigung verwendet werden.

Im folgenden Java-Code wird beispielsweise für das Thing-Objekt, auf das ursprünglich von 'thing1' verwiesen wurde, die einzige Referenz auf ein anderes Objekt auf dem Heap umgeleitet. Dies bedeutet, dass es dann nicht erreichbar ist und sein Speicher vom Garbage Collector nicht zugewiesen wird.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

Ein Beispiel für die Speicherbereinigung ist ARC, kurz für Automatic Reference Counting. Dies wird beispielsweise in Swift verwendet. ARC läuft darauf hinaus, die Verweise auf alle erstellten Objekte zu verfolgen. Wenn die Anzahl der Referenzen auf 0 fällt, wird das Objekt für die Freigabe markiert.

Mehr Informationen:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - Weitere Informationen zur Garbage Collection