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

Lua 垃圾回收

Lua utilise la gestion automatique de la mémoire. Cela signifie que vous n'avez pas à vous soucier de l'allocation de mémoire nécessaire pour les nouveaux objets créés, ni de la manière de libérer la mémoire occupée par les objets qui ne sont plus utilisés.

Lua a exécuté unRécupérateur de déchetspour collecter tousObjets morts (c'est-à-dire des objets auxquels on ne peut plus accéder dans Lua) pour effectuer le travail de gestion automatique de la mémoire. Tous les éléments de mémoire utilisés dans Lua, tels que : chaînes, tables, données utilisateur, fonctions, threads, structures internes, etc., sont soumis à une gestion automatique.

Lua implémente une marque incrémentale-Récupérateur de balayage. Il utilise ces deux nombres pour contrôler le cycle de récupération de déchets : le taux d'intervalle du récupérateur de déchets et le taux de progression du récupérateur de déchets. Ces deux nombres sont exprimés en pourcentage (par exemple : valeur 100 représente en interne 1 ).

Le taux d'intervalle du récupérateur de déchets contrôle le temps que le récupérateur doit attendre avant de commencer un nouveau cycle. Augmenter cette valeur réduira l'agressivité du récupérateur. Lorsque cette valeur est supérieure à 100 lorsque cette valeur est petite, le récupérateur ne attendra pas avant de commencer un nouveau cycle. Définir cette valeur à 200, cela fait en sorte que le récupérateur attende que l'utilisation totale de la mémoire atteigne le double de la précédente avant de commencer un nouveau cycle.

Le taux de progression du récupérateur de déchets contrôle le rapport de la vitesse de fonctionnement du récupérateur par rapport à la vitesse d'allocation de mémoire. Augmenter cette valeur rendra le récupérateur plus actif et augmentera également la longueur de chaque étape incrémentale. Ne pas définir cette valeur en dessous de 100, dans ce cas, le récupérateur fonctionne tellement lentement qu'il ne parviendra jamais à terminer un cycle. La valeur par défaut est 200, cela signifie que le récupérateur fonctionne à une vitesse "douce" par rapport à l'allocation de mémoire.

Si vous définissez le taux de progression par un nombre très grand (plus grand que le nombre d'octets que votre programme pourrait utiliser 10%%), le comportement du récupérateur est comme celui d'un stop-the-Récupérateur world. Ensuite, si vous réglez le taux d'intervalle sur 200, le comportement du récupérateur est le même que dans les versions précédentes de Lua : chaque fois que la mémoire utilisée par Lua double, une collecte complète est effectuée.

Fonctions du récupérateur de déchets

Lua propose les fonctions suivantescollectgarbage ([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