Lua - Müllabfuhr

Lua verwendet die automatische Speicherverwaltung, die die Speicherbereinigung basierend auf bestimmten in Lua integrierten Algorithmen verwendet. Als Ergebnis der automatischen Speicherverwaltung als Entwickler -

  • Sie müssen sich keine Gedanken über die Zuweisung von Speicher für Objekte machen.
  • Sie müssen sie nicht freigeben, wenn sie nicht mehr benötigt werden, außer wenn Sie sie auf Null setzen.

Lua verwendet einen Garbage Collector, der von Zeit zu Zeit ausgeführt wird, um tote Objekte zu sammeln, auf die über das Lua-Programm nicht mehr zugegriffen werden kann.

Alle Objekte, einschließlich Tabellen, Benutzerdaten, Funktionen, Thread, Zeichenfolge usw., unterliegen einer automatischen Speicherverwaltung. Lua verwendet einen inkrementellen Markierungs- und Sweep-Kollektor, der zwei Zahlen verwendet, um seine Speicherbereinigungszyklen zu steuern, nämlichgarbage collector pause und garbage collector step multiplier. Diese Werte sind in Prozent angegeben und der Wert 100 ist intern häufig gleich 1.

Garbage Collector Pause

Die Garbage Collector-Pause wird verwendet, um zu steuern, wie lange der Garbage Collector vorher warten muss. Es wird erneut von der automatischen Speicherverwaltung des Lua aufgerufen. Werte unter 100 würden bedeuten, dass Lua nicht auf den nächsten Zyklus wartet. In ähnlicher Weise würden höhere Werte dieses Wertes dazu führen, dass der Garbage Collector langsam und weniger aggressiv ist. Ein Wert von 200 bedeutet, dass der Kollektor darauf wartet, dass sich der verwendete Gesamtspeicher verdoppelt, bevor er einen neuen Zyklus startet. Abhängig von der Art und Geschwindigkeit der Anwendung kann es daher erforderlich sein, diesen Wert zu ändern, um die beste Leistung in Lua-Anwendungen zu erzielen.

Garbage Collector Step Multiplikator

Dieser Schrittmultiplikator steuert die relative Geschwindigkeit des Garbage Collectors zu der Speicherzuweisung im Lua-Programm. Größere Schrittwerte führen dazu, dass der Garbage Collector aggressiver wird, und erhöhen außerdem die Schrittgröße jedes inkrementellen Schritts der Garbage Collection. Werte unter 100 können häufig dazu führen, dass der Garbage Collector seinen Zyklus nicht abschließt und im Allgemeinen nicht bevorzugt wird. Der Standardwert ist 200, was bedeutet, dass der Garbage Collector doppelt so schnell ausgeführt wird wie die Speicherzuweisung.

Garbage Collector-Funktionen

Als Entwickler haben wir eine gewisse Kontrolle über die automatische Speicherverwaltung in Lua. Dafür haben wir folgende Methoden.

  • collectgarbage("collect") - Führt einen vollständigen Zyklus der Speicherbereinigung aus.

  • collectgarbage("count") - Gibt die derzeit vom Programm verwendete Speichermenge in Kilobyte zurück.

  • collectgarbage("restart") - Wenn der Garbage Collector gestoppt wurde, wird er neu gestartet.

  • collectgarbage("setpause")- Legt den als zweiten Parameter angegebenen Wert geteilt durch 100 für die Pausenvariable des Garbage Collector fest. Seine Verwendung ist wie oben beschrieben.

  • collectgarbage("setstepmul")- Setzt den als zweiten Parameter angegebenen Wert geteilt durch 100 auf die Müllschritt-Multiplikatorvariable. Seine Verwendung ist wie oben beschrieben.

  • collectgarbage("step")- Führt einen Schritt der Speicherbereinigung aus. Je größer das zweite Argument ist, desto größer wird dieser Schritt sein. Der Collectgarbage gibt true zurück, wenn der ausgelöste Schritt der letzte Schritt eines Garbage Collection-Zyklus war.

  • collectgarbage("stop") - Stoppt den Garbage Collector, wenn er ausgeführt wird.

Ein einfaches Beispiel mit dem Garbage Collector-Beispiel ist unten dargestellt.

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe. Bitte beachten Sie, dass dieses Ergebnis aufgrund des unterschiedlichen Betriebssystemtyps und der automatischen Speicherverwaltungsfunktion von Lua unterschiedlich sein wird.

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Sie können im obigen Programm sehen, dass nach Abschluss der Speicherbereinigung der verwendete Speicher reduziert wurde. Es ist jedoch nicht zwingend erforderlich, dies zu nennen. Auch wenn wir sie nicht aufrufen, wird sie zu einem späteren Zeitpunkt vom Lua-Interpreter nach der vordefinierten Zeit automatisch ausgeführt.

Natürlich können wir das Verhalten des Garbage Collectors bei Bedarf mithilfe dieser Funktionen ändern. Diese Funktionen bieten dem Entwickler zusätzliche Funktionen für komplexe Situationen. Abhängig von der Art des für das Programm benötigten Speichers können Sie diese Funktion verwenden oder nicht. Es ist jedoch sehr nützlich, die Speichernutzung in den Anwendungen zu kennen und diese während der Programmierung selbst zu überprüfen, um unerwünschte Ergebnisse nach der Bereitstellung zu vermeiden.