Lua - Recolección de basura
Lua usa la administración automática de memoria que usa la recolección de basura basada en ciertos algoritmos que están incorporados en Lua. Como resultado de la gestión automática de la memoria, como desarrollador:
- No hay necesidad de preocuparse por asignar memoria a los objetos.
- No es necesario liberarlos cuando ya no los necesite, excepto para establecerlo en cero.
Lua usa un recolector de basura que se ejecuta de vez en cuando para recolectar objetos muertos cuando ya no son accesibles desde el programa Lua.
Todos los objetos, incluidas tablas, datos de usuario, funciones, subprocesos, cadenas, etc., están sujetos a la gestión automática de la memoria. Lua usa un recolector incremental de marca y barrido que usa dos números para controlar sus ciclos de recolección de basura, a sabergarbage collector pause y garbage collector step multiplier. Estos valores están en porcentaje y el valor de 100 a menudo es igual a 1 internamente.
Pausa del recolector de basura
La pausa del recolector de basura se utiliza para controlar cuánto tiempo debe esperar el recolector de basura, antes; es llamado nuevamente por la administración automática de memoria de Lua. Los valores inferiores a 100 significarían que Lua no esperará al próximo ciclo. De manera similar, valores más altos de este valor darían como resultado que el recolector de basura fuera lento y menos agresivo por naturaleza. Un valor de 200 significa que el colector espera a que la memoria total en uso se duplique antes de comenzar un nuevo ciclo. Por lo tanto, dependiendo de la naturaleza y la velocidad de la aplicación, puede ser necesario modificar este valor para obtener el mejor rendimiento en las aplicaciones Lua.
Multiplicador de pasos del recolector de basura
Este multiplicador de pasos controla la velocidad relativa del recolector de basura a la de la asignación de memoria en el programa Lua. Los valores de paso más grandes harán que el recolector de basura sea más agresivo y también aumentará el tamaño de paso de cada paso incremental de la recolección de basura. Los valores inferiores a 100 a menudo pueden hacer que el recolector de basura no complete su ciclo y, en general, no es el preferido. El valor predeterminado es 200, lo que significa que el recolector de basura se ejecuta al doble de la velocidad de asignación de memoria.
Funciones del recolector de basura
Como desarrolladores, tenemos cierto control sobre la gestión automática de memoria en Lua. Para ello, disponemos de los siguientes métodos.
collectgarbage("collect") - Ejecuta un ciclo completo de recolección de basura.
collectgarbage("count") - Devuelve la cantidad de memoria utilizada actualmente por el programa en Kilobytes.
collectgarbage("restart") - Si el recolector de basura se ha detenido, lo reinicia.
collectgarbage("setpause")- Establece el valor dado como segundo parámetro dividido por 100 para la variable de pausa del recolector de basura. Sus usos son los discutidos un poco más arriba.
collectgarbage("setstepmul")- Establece el valor dado como segundo parámetro dividido por 100 para la variable multiplicadora del paso de basura. Sus usos son los discutidos un poco más arriba.
collectgarbage("step")- Ejecuta un paso de recolección de basura. Cuanto mayor sea el segundo argumento, mayor será este paso. La recolección de basura devolverá verdadero si el paso activado fue el último paso de un ciclo de recolección de basura.
collectgarbage("stop") - Detiene el recolector de basura si se está ejecutando.
A continuación se muestra un ejemplo sencillo que utiliza el ejemplo del recolector de basura.
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
Cuando ejecutamos el programa anterior, obtendremos el siguiente resultado. Tenga en cuenta que este resultado variará debido a la diferencia en el tipo de sistema operativo y también a la función de gestión automática de memoria de Lua.
23.1455078125 149
23.2880859375 295
0
22.37109375 380
Puede ver en el programa anterior, una vez que se realiza la recolección de basura, se reduce la memoria utilizada. Pero no es obligatorio llamar a esto. Incluso si no los llamamos, el intérprete de Lua lo ejecutará automáticamente en una etapa posterior después del período predefinido.
Obviamente, podemos cambiar el comportamiento del recolector de basura usando estas funciones si es necesario. Estas funciones proporcionan un poco de capacidad adicional para que el desarrollador maneje situaciones complejas. Dependiendo del tipo de memoria que necesite el programa, es posible que utilice esta función o no. Pero es muy útil conocer el uso de memoria en las aplicaciones y comprobarlo durante la propia programación para evitar resultados no deseados tras la implementación.