Recolección de basura en Lua
Lua utiliza gestión automática de memoria. Esto significa que no tienes que preocuparte por cómo se asigna la memoria necesaria para los objetos recién creados, ni por cómo liberar la memoria que ocupan cuando ya no se utilizan.
Lua ejecuta unrecolector de basurapara recoger todos losobjetos muertos(es decir, objetos que ya no son accesibles en Lua) para llevar a cabo la gestión automática de memoria. Toda la memoria utilizada en Lua, como cadenas, tablas, datos de usuario, funciones, hilos, estructuras internas, etc., está sujeta a gestión automática.
Lua implementa un recolector incremental de marcado y barrido. Utiliza estos dos números para controlar el ciclo de recolección de basura: la tasa de pausa del recolector de basura y el multiplicador de paso del recolector de basura. Ambos números se expresan en porcentaje (por ejemplo: el valor 100 representa internamente 1).
La tasa de pausa del recolector de basura controla cuánto tiempo debe esperar el recolector antes de iniciar un nuevo ciclo. Aumentar este valor reduce la actividad del recolector. Cuando este valor es menor que 100, el recolector no espera antes de iniciar un nuevo ciclo. Establecer este valor en 200 hace que el recolector espere hasta que el uso total de memoria alcance el doble del anterior antes de iniciar un nuevo ciclo.
El multiplicador de paso del recolector de basura controla la velocidad de operación del recolector en relación con la velocidad de asignación de memoria. Aumentar este valor no solo hace que el recolector sea más activo, sino que también aumenta la longitud de cada paso incremental. No configure este valor por debajo de 100, porque el recolector trabajaría tan lentamente que nunca terminaría un ciclo. El valor predeterminado es 200, lo que significa que el recolector trabaja al "doble" de la velocidad de asignación de memoria.
Si establece el multiplicador de paso en un número muy grande (un 10% mayor que la cantidad de bytes que su programa pueda usar), el recolector se comportará como un recolector stop-the-world. Luego, si establece la tasa de pausa en 200, el comportamiento del recolector será el mismo que en versiones anteriores de Lua: cada vez que la memoria utilizada por Lua se duplique, se realizará una recolección completa.
Funciones del recolector de basura
Lua proporciona las siguientes funcionescollectgarbage ([opt [, arg]])para controlar la gestión automática de memoria:
collectgarbage("collect"): Realiza un ciclo completo de recolección de basura. Mediante el parámetro opt, ofrece un conjunto de diferentes funciones:
collectgarbage("count"): Devuelve la cantidad total de memoria utilizada por Lua en K bytes. Este valor tiene parte fraccionaria, por lo que basta con multiplicarlo por 1024 para obtener el número exacto de bytes utilizados por Lua (a menos que haya desbordamiento).
collectgarbage("restart"): Reinicia la ejecución automática del recolector de basura.
collectgarbage("setpause"): Establece arg como la tasa de pausa del recolector. Devuelve el valor anterior de la tasa de pausa.
collectgarbage("setstepmul"): Devuelve el valor anterior del multiplicador de paso.
collectgarbage("step"): Ejecuta un solo paso del recolector de basura. El "tamaño" del paso está controlado por arg. Si se pasa 0, el recolector avanza un paso (indivisible). Si se pasa un valor distinto de 0, el recolector realiza el trabajo equivalente a la asignación de esa cantidad de memoria (en K bytes) por parte de Lua. Devuelve true si el recolector termina un ciclo.
collectgarbage("stop"): Detiene la ejecución del recolector de basura. Hasta que se llame a reiniciar, el recolector solo se ejecutará mediante llamadas explícitas.
A continuación se muestra un ejemplo simple de recolección de basura:
Ejemplo
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
Al ejecutar el programa anterior, el resultado es el siguiente (observe el cambio en el uso de memoria):
20.9560546875 20.9853515625 0 19.4111328125Otras extensiones