English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua垃圾回收

Lua verwendet automatische Speicherverwaltung. Dies bedeutet, dass Sie sich keine Sorgen machen müssen, wie die für neue Objekte erforderliche Speichermenge bereitgestellt wird, und wie die Speicher, die von Objekten belegt werden, freigegeben werden, wenn sie nicht mehr verwendet werden.

Lua führt einenGARBAGE COLLECTORum alle zu sammelnTOTALE OBJEKTE (d.h. Objekte, die in Lua nicht mehr erreichbar sind), um die Arbeit der automatischen Speicherverwaltung zu erledigen. Alle in Lua verwendeten Speicher, wie: Strings, Tabellen, Benutzerdaten, Funktionen, Threads, interne Strukturen usw., unterliegen der automatischen Verwaltung.

Lua implementiert einen inkrementellen Markierungs-SCANNING COLLECTOR. Er verwendet diese beiden Zahlen, um den GARBAGE COLLECTOR Zyklus zu steuern: den Intervallfaktor des GARBAGE COLLECTORS und den Schrittweitenvergrößerungsfaktor. Beide Werte werden in Prozenten angegeben (z.B. Wert 100 im internen Sinne 1 )

Der Intervallfaktor des GARBAGE COLLECTORS kontrolliert, wie lange der Sammler warten muss, bevor er einen neuen Zyklus startet. Eine Erhöhung dieses Wertes verringert die Aktivität des Sammlers. Wenn dieser Wert 100, wenn dieser Wert klein ist, wartet der Sammler nicht, bevor er einen neuen Zyklus startet. Setzen Sie diesen Wert auf 200, so beginnt der Sammler erst einen neuen Zyklus, wenn die Gesamtnutzung des Speichers das Doppelte des vorherigen Wertes erreicht hat.

Der Schrittweitenvergrößerungsfaktor des GARBAGE COLLECTORS kontrolliert das Verhältnis der Sammlergeschwindigkeit zur Speicherzuweisungsgeschwindigkeit. Eine Erhöhung dieses Wertes macht den Sammler aktiver und verlängert die Länge jedes Schritts. Setzen Sie diesen Wert nicht kleiner als 100, dann arbeitet der Sammler so langsam, dass er einen Zyklus niemals beenden kann. Der Standardwert ist 200, das bedeutet, dass der Sammler mit der "doppelten" Geschwindigkeit der Speicherzuweisung arbeitet.

Wenn Sie die Schrittweitenvergrößerung auf eine sehr große Zahl (größer als die möglicherweise von Ihrem Programm benötigte Bytes) einstellen 10%%), das Verhalten des Sammlers ist wie ein stop-the-WORLD SAMMLER. Wenn Sie dann die Intervallrate einstellen 200, das Verhalten des Sammlers ist wie in früheren Lua-Versionen: Jedes Mal, wenn die von Lua verwendete Speichermenge verdoppelt wird, wird eine vollständige Sammlung durchgeführt.

GARBAGE COLLECTOR FUNKTIONEN

Lua bietet die folgenden Funktionencollectgarbage ([opt [, arg]])用来控制自动内存管理:

  • collectgarbage("collect"):  做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:

  • collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

  • collectgarbage("restart"): 重启垃圾收集器的自动运行。

  • collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。

  • collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。

  • collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

  • collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。

以下演示了一个简单的垃圾回收示例:

mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))

执行以上程序,输出结果如下(注意内存使用的变化):

20.9560546875
20.9853515625
0
19.4111328125