Bienvenidos sean a este post, hoy hablaremos sobre un tema que si bien lo hemos mencionado antes no hemos profundizado en el mismo.
Si bien este mecanismo existe desde la primera version y hasta la version 5.0 de Lua trabajo como un simple mecanismo de marcar y barrer, este recolector a veces es llamado como el recolector «detengan al mundo!», lo cual implica que de cuando en cuando Lua detiene la interpretacion del programa principal para ejecutar un ciclo de recoleccion de basura completo, cada ciclo esta compuesta de cuatro fases:
- Marcar
- Limpiar
- Barrer
- Finalizar
Lua comienza la fase de marcar marcando, valga la redundancia, como activo su conjunto raiz, los objetos que Lua tiene acceso directo, es decir el registro y el proceso principal, cualquier objeto almacenado en un objeto activo es alcanzable por el programa y por lo tanto es marcado como activo tambien, la fase de marca termina cuando todos los objetos alcanzables son marcados como activos.
Antes de comenzar la fase de barrer, Lua ejecuta la fase de limpieza la cual esta relacionada a los finalizadores y tablas debiles, primero atraviesa todos los userdatas buscando a los userdatas no marcados con un metametodo __gc, estos userdatas estan marcados como activos y los pone en una lista separada para ser usada en la fase de finalizacion, despues atraviesa sus tablas debiles y remueve de ellas todas las entradas donde la clave o el valor no estan marcados.
La fase de barrer atraviesa todos los objetos de Lua, para permitir esta traversal Lua mantiene todos los objetos que crea en una lista enlazada, si un objeto no esta marcado como activo Lua lo recolecta, de lo contrario Lua limpia su marca en preparacion para el proximo ciclo.
La ultima fase, finalizacion, llama a los finalizadores del userdata que fueron separados en la fase de limpieza, esto es hecho despues de las otras fases para simplificar el manejo de errores, un finalizador erroneo podria lanzar un error pero el recolector de basura no se puede detener durante otras fases de la recoleccion, al riesgo de dejar a Lua en un estado inconsistente, si se detiene durante esta ultima fase no hay problem porque el proximo ciclo llamara a los finalizadores del userdata que fueron dejados en la lista.
A partir de la version 5.1 Lua consiguio un recolector incremental, este nuevo recolector incremental ejecuta los mismos pasos que el viejo pero no necesita detener el mundo mientras se ejecuta, en su lugar corre intercalado con el interprete cada vez que el interprete asigna alguna cantidad fija de memoria, el recolector ejecuta un pequeño paso mientras este trabaja, permitiendo al interprete poder cambiar la accesibilidad del objeto, para asegurar las correcciones del recolector, algunas operaciones en el interprete tiene barreras que detectan cambios peligrosos y corrige las marcas de los objetos involucrados.
En resumen, hoy hemos hablado del recolector de basura, que es, para que se usa, como trabaja, su funcionamiento basico y su nueva caracteristica a partir de la version 5.1, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.


Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50