Collecte des déchets Lua


Lua utilise la gestion automatique de la mémoire. Cela signifie que vous n'avez pas à vous soucier de la manière d'allouer la mémoire requise pour les objets nouvellement créés, ni à vous soucier de la manière de libérer la mémoire occupée par les objets une fois qu'ils ne sont plus utilisés.

Lua exécute un garbage collector pour collecter tous les objets morts (c'est-à-dire les objets auxquels on ne peut plus accéder dans Lua) pour terminer le travail de gestion automatique de la mémoire . Toute la mémoire utilisée dans Lua, comme les chaînes, les tables, les données utilisateur, les fonctions, les threads, les structures internes, etc., sont soumises à une gestion automatique.

Lua implémente un collecteur de scan de marques incrémentiel. Il utilise ces deux nombres pour contrôler le cycle de garbage collection : le taux d’intervalle du garbage collector et le taux d’étape du garbage collector. Les deux nombres sont exprimés en unités de pourcentage (par exemple : une valeur de 100 représente 1 en interne).

Le taux de pause du garbage collector contrôle la durée pendant laquelle le garbage collector doit attendre avant de démarrer un nouveau cycle. Augmenter cette valeur rendra le collectionneur moins agressif. Lorsque cette valeur est inférieure à 100, le collecteur n'attendra pas avant de démarrer un nouveau cycle. En définissant cette valeur sur 200, le collecteur attendra que l'utilisation totale de la mémoire atteigne le double de la valeur précédente avant de démarrer un nouveau cycle.

Le taux de pas du garbage collector contrôle la vitesse à laquelle le collecteur fonctionne par rapport à la vitesse d'allocation de mémoire. L'augmentation de cette valeur rend non seulement le collecteur plus agressif, mais augmente également la durée de chaque étape incrémentielle. Ne réglez pas cette valeur à moins de 100, sinon le collecteur fonctionnera trop lentement et ne terminera jamais un cycle. La valeur par défaut est 200 , ce qui signifie que le collecteur fonctionne « deux fois » plus vite que l'allocation de mémoire.

Si vous définissez le multiplicateur d'étapes sur un très grand nombre (10 % supérieur au nombre d'octets que votre programme est susceptible d'utiliser), le collecteur se comporte comme un dispositif de collecte stop-the-world. Si vous fixez ensuite le taux de pause à 200, le collecteur se comporte de la même manière que dans les versions précédentes de Lua : chaque fois que Lua double la mémoire utilisée, une collecte complète est effectuée.


Fonction Garbage collector

Lua fournit la fonction suivante collectgarbage ([opt [, arg]]) pour contrôler la gestion automatique de la mémoire :

  • collectgarbage("collect") : Effectuez un cycle complet de collecte des déchets. Il fournit un ensemble différent de fonctions via le paramètre opt :

  • collectgarbage("count") : Renvoie la mémoire totale utilisée par Lua en nombre de K octets. Cette valeur a une partie fractionnaire, il suffit donc de la multiplier par 1024 pour obtenir le nombre exact d'octets utilisés par Lua (sauf débordement).

  • collectgarbage("restart") : Redémarre le fonctionnement automatique du ramasse-miettes.

  • collectgarbage("setpause") : Définissez arg sur le taux de pause du collecteur (voir §2.5). Renvoie la valeur précédente du taux d'intervalle.

  • collectgarbage("setstepmul") : Renvoie la valeur précédente du grossissement par incréments.

  • collectgarbage("step") : Exécutez le garbage collector en une seule étape. L'étape "taille" est contrôlée par arg. Lorsque 0 est transmis, le collecteur avance d'un pas (indivisible). En passant une valeur non nulle, le collecteur fait l'équivalent de Lua en allouant ces nombreux (K octets) de mémoire. Renvoie vrai si le collecteur termine une boucle.

  • collectgarbage("stop") : Arrêtez le ramasse-miettes. Le collecteur ne s'exécutera que pour les appels explicites avant d'appeler restart.

Ce qui suit montre un exemple simple de garbage collection :

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Exécutez le programme ci-dessus et les résultats de sortie sont les suivants (notez le changement dans l'utilisation de la mémoire) :

20.9560546875
20.9853515625
0
19.4111328125