Lua-Garbage-Collection
Lua verwendet automatische Speicherverwaltung. Das bedeutet, Sie müssen sich keine Gedanken darüber machen, wie Speicher für neu erstellte Objekte zugewiesen wird, noch darüber, wie der von ihnen belegte Speicher freigegeben wird, nachdem die Objekte nicht mehr verwendet werden.
Lua führt einenGarbage Collectoraus, um alletoten Objekte(d. h., Objekte, auf die in Lua nicht mehr zugegriffen werden kann) zu sammeln, um die Arbeit der automatischen Speicherverwaltung abzuschließen. Der gesamte in Lua verwendete Speicher, wie Strings, Tabellen, Userdata, Funktionen, Threads, interne Strukturen usw., unterliegt der automatischen Verwaltung.
Lua implementiert einen inkrementellen Mark-and-Sweep-Collector. Er verwendet diese beiden Zahlen, um den Garbage-Collection-Zyklus zu steuern: die Garbage-Collector-Pausenrate und den Garbage-Collector-Schrittmultiplikator. Beide Zahlen sind in Prozent angegeben (z. B. wird der Wert 100 intern als 1 dargestellt).
Die Garbage-Collector-Pause steuert, wie lange der Collector warten muss, bevor er einen neuen Zyklus beginnt. Eine Erhöhung dieses Werts verringert den Eifer des Collectors. Wenn dieser Wert kleiner als 100 ist, wartet der Collector nicht, bevor er einen neuen Zyklus beginnt. Wenn Sie diesen Wert auf 200 setzen, wartet der Collector, bis die gesamte Speichernutzung das Doppelte des vorherigen Betrags erreicht hat, bevor er einen neuen Zyklus beginnt.
Der Garbage-Collector-Schrittmultiplikator steuert die Rate, mit der der Collector relativ zur Speicherzuweisungsrate arbeitet. Eine Erhöhung dieses Werts macht den Collector nicht nur aggressiver, sondern erhöht auch die Länge jedes inkrementellen Schritts. Setzen Sie diesen Wert nicht unter 100, da der Collector sonst zu langsam arbeitet, um jemals einen Zyklus abzuschließen. Der Standardwert ist 200, was bedeutet, dass der Collector mit der "doppelten" Geschwindigkeit der Speicherzuweisung arbeitet.
Wenn Sie den Schrittmultiplikator auf eine sehr große Zahl setzen (10 % größer als die Anzahl der Bytes, die Ihr Programm möglicherweise verwendet), verhält sich der Collector wie ein Stop-the-World-Collector. Wenn Sie dann die Pausenrate auf 200 setzen, verhält sich der Collector wie frühere Lua-Versionen: Jedes Mal, wenn sich der Speicherverbrauch von Lua verdoppelt, wird eine vollständige Collection durchgeführt.
Garbage-Collector-Funktionen
Lua bietet die folgenden Funktionencollectgarbage ([opt [, arg]])zur Steuerung der automatischen Speicherverwaltung:
collectgarbage("collect"): Führt einen vollständigen Garbage-Collection-Zyklus aus. Über den Parameter opt bietet sie eine Reihe verschiedener Funktionen:
collectgarbage("count"): Gibt den gesamten von Lua verwendeten Speicher in K Bytes zurück. Dieser Wert hat einen Nachkommateil; multiplizieren Sie ihn einfach mit 1024, um die genaue Anzahl der von Lua verwendeten Bytes zu erhalten (sofern kein Überlauf auftritt).
collectgarbage("restart"): Startet den automatischen Betrieb des Garbage Collectors neu.
collectgarbage("setpause"): Setzt arg als Pausenrate des Collectors. Gibt den vorherigen Wert der Pausenrate zurück.
collectgarbage("setstepmul"): Gibt den vorherigen Wert des Schrittmultiplikators zurück.
collectgarbage("step"): Führt den Garbage Collector in einem einzelnen Schritt aus. Die "Größe" des Schritts wird durch arg gesteuert. Wenn 0 übergeben wird, führt der Collector einen (unteilbaren) Schritt aus. Wenn ein Wert ungleich null übergeben wird, verrichtet der Collector Arbeit, die äquivalent dazu ist, dass Lua so viele (K Bytes) Speicher zuweist. Wenn der Collector einen Zyklus beendet, gibt er true zurück.
collectgarbage("stop"): Stoppt den Betrieb des Garbage Collectors. Bis restart aufgerufen wird, läuft der Collector nur, wenn er explizit aufgerufen wird.
Das Folgende zeigt ein einfaches Beispiel für Garbage Collection:
Beispiel
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
Führen Sie das obige Programm aus, die Ausgabe lautet wie folgt (beachten Sie die Änderung der Speichernutzung):
20.9560546875 20.9853515625 0 19.4111328125Andere Erweiterungen