Latest web development tutorials

collecte des ordures Lua

Lua utilise la gestion automatique de la mémoire. Cela signifie que vous ne devez pas vous inquiéter à propos de l'objet nouvellement créé sur la façon d'allouer de la mémoire, ils ne considèrent pas comment ils libèrent la mémoire occupée après que l'objet ne soit plus utilisé.

Lua exécute ungarbage collector pour recueillir tous les objets morts(qui est, les objets ne peuvent pas être accessibles en Lua) pour effectuer la gestion automatique de la mémoire. Lua est utilisé dans toute la mémoire, tels que: string, tableaux, les données de l'utilisateur, les fonctions, les discussions, la structure interne, etc., sont soumis à une gestion automatique.

Lua implémente une marque incrémental - collecteur Scan. Il utilise deux chiffres pour contrôler le cycle de collecte des ordures ménagères: ordures taux de collecte garbage collector et intermittente stepping grossissement. Ces deux chiffres utilisent le pourcentage d'unités (par exemple: une valeur de 100 dans la représentation interne 1).

Collecte des ordures ménagères contrôle par intermittence le taux doit recueillir avant d'ouvrir un nouveau cycle à attendre longtemps. L'augmentation de cette valeur permettra de réduire l'enthousiasme du collectionneur. Lorsque cette valeur est inférieure à 100, lorsque le collecteur avant d'ouvrir le nouveau cycle ne sera pas attendre. Définissez cette valeur à 200 permettra aux collectionneurs d'attendre jusqu'à ce que deux fois l'utilisation de la mémoire totale atteint avant le début d'un nouveau cycle.

Le stepper agrandissement garbage collector contrôle la vitesse de fonctionnement du collecteur par rapport au rapport de vitesse d'allocation de mémoire. Cela permettra non seulement d'augmenter la valeur du collecteur plus agressif, mais aussi d'augmenter la durée de chaque étape incrémentale. Ne pas définir cette valeur à moins de 100, donc si le collecteur de travailler lentement pour toujours tellement à faire une boucle. La valeur par défaut est de 200, ce qui signifie que l'allocation de mémoire au collecteur du "double" travail de vitesse.

Si vous entrez un grossissement à un très grand nombre (le nombre d'octets que vous peut être utilisé dans le programme est également 10% plus grand), le collecteur agit comme un collecteur stop-the-world. Ensuite, si vous mettez le taux intermittent fixé à 200, le comportement du collecteur et les versions antérieures Lua du même: chaque mémoire utilisée par Lua a doublé, pour faire une collection complète.


fonction Garbage collector

Lua fournit les fonctionscollectgarbage suivantes ([opt [, arg]]) est utilisé pour contrôler la gestion automatique de la mémoire:

  • collectgarbage ( «recueillir»): faire un cycle complet de collecte des ordures.Le paramètre opt qui fournit un ensemble différent de fonctions:

  • collectgarbage ( "count"): K pour retourner le nombre d'octets de quantité totale de mémoire utilisée par Lua.Cette valeur a une partie fractionnaire, nous avons seulement besoin de multiplier 1024 vous pouvez obtenir le nombre exact d'octets utilisé par Lua (sauf si dépassement).

  • collectgarbage ( "redémarrage"): Redémarrez le garbage collector exécute automatiquement.

  • collectgarbage ( "setpause"): Réglez le débit intermittent arg de collecteur (voir sect; 2.5).Retour à la valeur précédente du taux intermittent.

  • collectgarbage ( "setstepmul"): Renvoie la valeur précédente de l'agrandissement de l' étape.

  • collectgarbage ( "step"): une étape exécuter le garbage collector.Etape "taille" par un contrôle de arg. 0 entrant collecteur stepper étape (indivisible). Valeur entrant non nulle, collecteur pour recueillir l'allocation Lua équivalente de ces multiples (K octets) du travail de mémoire. Si la fin de collecteur d'un cycle retourne vrai.

  • collectgarbage ( "stop"): Arrêtez les garbage collector exécute.Avant d'appeler le redémarrage, le collecteur seulement à cause d'un appel explicite à exécuter.

Ce qui suit montre un exemple simple de collecte des ordures:

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Le programme ci-dessus, les résultats de sortie sont les suivants (changement de note à l'utilisation de la mémoire):

20.9560546875
20.9853515625
0
19.4111328125