Latest web development tutorials

Lua Garbage Collection

Lua verwendet automatische Speicherverwaltung. Dies bedeutet, dass Sie nicht über das neu erstellte Objekt kümmern müssen, wie Speicher zuzuweisen, sie berücksichtigen nicht, wie sie das nach dem Objekt belegten Speicher freigeben wird nicht mehr verwendet werden.

Lua läuft einGarbage Collector alle toten Objektezu sammeln (das heißt, können die Objekte nicht in Lua zugegriffen werden kann) automatische Speicherverwaltung durchzuführen. Lua wird in all den Speicher verwendet werden, wie: string, Tabellen, Benutzerdaten, Funktionen, Fäden, interne Struktur usw. unterliegen automatische Verwaltung.

Lua implementiert eine inkrementelle Markierung - Scan Sammler. Es verwendet zwei Zahlen die Garbage-Collection-Zyklus zu steuern: Garbage Collector Müllsammelrate und intermittierende Schritt Vergrößerung. Beide Zahlen verwenden den Anteil der Einheiten (zum Beispiel: ein Wert von 100 in der internen Darstellung 1).

Die Garbage-Collection intermittierend steuert die Rate einen neuen Zyklus zu sammeln muss vor dem Öffnen lange zu warten. Je höher der Wert, die Begeisterung des Sammlers zu reduzieren. Wenn dieser Wert kleiner als 100, wenn der Kollektor, bevor der neue Zyklus Öffnen nicht warten müssen. Setzen Sie diesen Wert auf 200 wird Kollektoren erlauben, zu warten, bis die zweimal die gesamte Speichernutzung vor dem Beginn eines neuen Zyklus erreicht.

Der Garbage Collector Schritt Vergrößerung steuert die Betriebsgeschwindigkeit des Kollektors relativ zum Drehzahlverhältnis Speicherzuweisung. Dies wird nicht nur den Wert des Kollektors erhöhen aggressiver, sondern auch die Länge der einzelnen inkrementellen Schritt erhöhen. Sie diesen Wert nicht auf weniger als 100, so dass, wenn der Sammler langsam zu arbeiten, so immer so viel um eine Schleife zu tun. Der Standardwert ist 200, was bedeutet, dass die Speicherzuweisung an den Kollektor des "doppelten" Geschwindigkeit arbeiten.

Wenn Sie Vergrößerung zu einer sehr großen Zahl Schritt (die Anzahl von Bytes, als man in dem Programm verwendet werden kann, ist ebenfalls 10% größer), wirkt der Kollektor wie ein Stopp-the-world Sammler. Dann, wenn Sie die intermittierende Rate auf 200 gesetzt setzen, das Verhalten des Kollektors und Vergangenheit Lua Versionen des gleichen: jeder Speicher von Lua verwendet verdoppelt, eine komplette Sammlung zu tun.


Garbage-Collector-Funktion

Lua bietet die folgenden FunktionenCollectGarbage ([opt [, arg] ]) verwendet wird , automatische Speicherverwaltung zu steuern:

  • CollectGarbage ( "sammeln"): tun , um eine vollständige Sammlung Zyklus Müll.Der Parameter opt, die einen anderen Satz von Funktionen zur Verfügung stellt:

  • CollectGarbage ( "count"): K die Anzahl von Bytes Gesamtmenge des Speichers von Lua verwendet , um zurückzukehren.Dieser Wert hat einen Bruchteil, wir brauchen nur 1024 zu multiplizieren Sie die genaue Anzahl von Bytes von Lua (es sei denn, Nachlauf) verwendet zu bekommen.

  • CollectGarbage ( "Neustart"): Starten Sie den Garbage Collector automatisch ausgeführt wird .

  • CollectGarbage ( "setpause"): Stellen Sie die ARG Kollektor intermittierenden Rate (siehe Abschnitt; 2.5).Zurück zum vorherigen Wert des intermittierenden Rate.

  • CollectGarbage ( "setstepmul"): Gibt den vorherigen Wert des Schrittes Vergrößerung.

  • CollectGarbage ( "Schritt"): Ein-Schritt der Garbage Collector ausgeführt werden .Step "Größe" von einem arg Kontrolle. 0 eingehenden Kollektor Steppers (unteilbar) Schritt. Ankommende Nicht-Null-Wert, Kollektor das Äquivalent Lua Zuteilung dieser mehrere (K Bytes) von Erinnerungsarbeit zu sammeln. Wenn die Kollektor Ende eines Zyklus wird true zurück.

  • CollectGarbage ( "Stop"): Stoppen Sie die Garbage Collector läuft.Vor dem Neustart Aufruf, nur der Kollektor aufgrund einer expliziten Aufruf auszuführen.

Im Folgenden zeigt eine einfache Garbage Collection Beispiel:

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Das obige Programm sind die Ausgabeergebnisse wie folgt (Hinweis Änderung der Speichernutzung):

20.9560546875
20.9853515625
0
19.4111328125