Lua - Collecte des ordures
Lua utilise la gestion automatique de la mémoire qui utilise le garbage collection basé sur certains algorithmes intégrés à Lua. Grâce à la gestion automatique de la mémoire, en tant que développeur -
- Pas besoin de s'inquiéter de l'allocation de mémoire pour les objets.
- Pas besoin de les libérer lorsqu'ils ne sont plus nécessaires, sauf pour le régler sur zéro.
Lua utilise un garbage collector qui s'exécute de temps en temps pour collecter les objets morts lorsqu'ils ne sont plus accessibles à partir du programme Lua.
Tous les objets, y compris les tables, les données utilisateur, les fonctions, les threads, les chaînes, etc. sont soumis à une gestion automatique de la mémoire. Lua utilise un collecteur de marquage et de balayage incrémentiel qui utilise deux nombres pour contrôler ses cycles de ramassage des ordures, à savoirgarbage collector pause et garbage collector step multiplier. Ces valeurs sont en pourcentage et la valeur de 100 est souvent égale à 1 en interne.
Pause du ramasse-miettes
La pause du ramasse-miettes est utilisée pour contrôler combien de temps le ramasse-miettes doit attendre, avant; il est à nouveau appelé par la gestion automatique de la mémoire du Lua. Des valeurs inférieures à 100 signifieraient que Lua n'attendra pas le prochain cycle. De même, des valeurs plus élevées de cette valeur entraîneraient un ramasse-miettes lent et moins agressif par nature. Une valeur de 200 signifie que le collecteur attend que la mémoire totale utilisée double avant de démarrer un nouveau cycle. Par conséquent, selon la nature et la vitesse de l'application, il peut être nécessaire de modifier cette valeur pour obtenir les meilleures performances dans les applications Lua.
Multiplicateur d'étapes de Garbage Collector
Ce multiplicateur d'étapes contrôle la vitesse relative du ramasse-miettes par rapport à celle de l'allocation de mémoire dans le programme Lua. Des valeurs d'étape plus élevées conduiront le garbage collector à être plus agressif et augmentera également la taille d'étape de chaque étape incrémentielle de garbage collection. Les valeurs inférieures à 100 peuvent souvent conduire à éviter que le garbage collector ne termine son cycle et ce n'est généralement pas préféré. La valeur par défaut est 200, ce qui signifie que le garbage collector s'exécute deux fois plus vite que la vitesse d'allocation de mémoire.
Fonctions du ramasse-miettes
En tant que développeurs, nous avons un certain contrôle sur la gestion automatique de la mémoire dans Lua. Pour cela, nous avons les méthodes suivantes.
collectgarbage("collect") - Exécute un cycle complet de garbage collection.
collectgarbage("count") - Renvoie la quantité de mémoire actuellement utilisée par le programme en kilo-octets.
collectgarbage("restart") - Si le ramasse-miettes a été arrêté, il le redémarre.
collectgarbage("setpause")- Définit la valeur donnée comme deuxième paramètre divisée par 100 à la variable de pause du ramasse-miettes. Ses utilisations sont telles que discutées un peu ci-dessus.
collectgarbage("setstepmul")- Définit la valeur donnée comme deuxième paramètre divisée par 100 à la variable multiplicateur de pas de garbage. Ses utilisations sont décrites un peu ci-dessus.
collectgarbage("step")- Exécute une étape de garbage collection. Plus le deuxième argument est grand, plus cette étape sera grande. Le collectgarbage retournera true si l'étape déclenchée était la dernière étape d'un cycle de garbage collection.
collectgarbage("stop") - Arrête le ramasse-miettes s'il est en cours d'exécution.
Un exemple simple utilisant l'exemple de ramasse-miettes est illustré ci-dessous.
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
Lorsque nous exécutons le programme ci-dessus, nous obtiendrons la sortie suivante. Veuillez noter que ce résultat variera en raison de la différence de type de système d'exploitation et également de la fonction de gestion automatique de la mémoire de Lua.
23.1455078125 149
23.2880859375 295
0
22.37109375 380
Vous pouvez voir dans le programme ci-dessus, une fois que le garbage collection est terminé, il réduit la mémoire utilisée. Mais ce n'est pas obligatoire d'appeler cela. Même si nous ne les appelons pas, il sera exécuté automatiquement à un stade ultérieur par l'interpréteur Lua après la période prédéfinie.
Évidemment, nous pouvons changer le comportement du garbage collector en utilisant ces fonctions si nécessaire. Ces fonctions fournissent un peu de capacité supplémentaire au développeur pour gérer des situations complexes. Selon le type de mémoire nécessaire pour le programme, vous pouvez ou non utiliser cette fonction. Mais il est très utile de connaître l'utilisation de la mémoire dans les applications et de la vérifier lors de la programmation elle-même pour éviter des résultats indésirables après le déploiement.