Buenas programadores/as que disfrutáis la programación.
Esto de escribir, la verdad es que me está empezando a gustar, y hoy quisiera hablaros de un concepto de programación que me resulta de especial curiosidad, y es sobre el Recolector de Basuras (Garbaje Collector), es un concepto del cual la gente que programa a alto nivel no se suele dar cuenta por que ya te lo dan hecho, pero básicamente este concepto tiene que ver con la gestión de memoria de un programa, con esto de que todas las cosas que se vayan creando en la memoria y más tarde no se vayan a usar, se tienen que destruir por que ocupa espacio, en definitiva, es un proceso que va comprobando constantemente cuales son las cosas que están en la memoria, las cuales no se están usando o no se van a usar en un futuro, y en cuanto las encuentra, entonces las desecha con el fin de liberar espacio para futuras creaciones que se vayan a necesitar.
Este proceso en los lenguajes modernos es bastante chulo por que quita al programador de la carga que supone liberar memoria que vamos creando, y además es un proceso que ya viene incorporado en dichos lenguajes y que ejecuta su lógica por detrás sin que nadie se tenga que preocupar de nada, es básicamente lo mismo que le pasa a una persona cuando va guardando cosas en la habitación que va a usar y que luego no usa y que alguien nos dice que tenemos que tirarlas porque no solo no las usamos sino que además nos ocupan espacio y entonces tenemos que aproximarnos a un cubo de basura o a un punto limpio en caso de que se tengan que reciclar de otra forma, pues este recolector lo que hace es que cuando ve una cosa que no se está usando la tira el directamente por nosotros, ahorrándonos la tarea de buscar en nuestra habitación lo que no nos sirve, e incluso nos ahorra el transporte.
Por dar una explicación un poco más técnica de lo que es recolector, cuando nosotros creamos un objeto en nuestro programa, lo que estamos es creando un espacio en memoria donde se almacena la información de ese objeto (porque al final el objeto no deja de ser una instancia de una clase, y esa clase tiene sus atributos y sus métodos, es decir, su información) y además de una referencia a ese espacio creado, que será nuestro puntero. Imagínense que tenemos creada nuestra clase Cosa, indiferentemente de cuál sea el lenguaje moderno en el que estemos, con las características, tipo y descripción, y me creo dos objetos de la misma clase, es decir, dos con sus tipos y sus descripciones.
Como podemos ver en la foto, los objetos están creados, ocupando un pequeño espacio de la memoria, y cada una está referenciada por su puntero (objeto1 y objeto2), eso significa que cada vez que queramos acceder al espacio de memoria apuntado por el objeto1, vamos a obtener el coche, y en el otro caso obtendríamos la consola, es decir, que el único seguro que tenemos para poder siempre acceder al coche es que haya siempre alguien apuntando a ese espacio.
Ahora imagínense que el objeto1 se cambia de referencia y pasa a apuntar al espacio de memoria apuntado por el objeto2, es decir, que el objeto1 y el objeto2 apunten al mismo espacio de memoria que es donde se encuentra la consola, hemos podido apuntar a ese espacio con el objeto1 por que recuerden que tenemos otra referencia apuntando a eso (objeto2) y lo único que habríamos hecho sería igualar la referencia del objeto1 a la del objeto2.
Ponte que luego quieres volver a recuperar el coche por que lo quieres usar para lo que sea, ya te digo yo lo que va a pasar, que simplemente no vas a poder, porque no hay nadie apuntando a ese sitio, no tenemos una referencia de donde está el coche, se ha perdido en la memoria, es decir, sabemos que está ahí pero no donde, es cuando entra al rescate nuestro recolector de basura salvándonos de que estemos desperdiciando espacio en memoria de manera innecesaria, por que pasa que el coche sabemos que está ahí, pero no donde, y lo mejor de todo es que nos está ocupando espacio que de ninguna manera vamos a poder usar porque no sabemos ni donde se encuentra, ahí es cuando el recolector de basura comprueba que cosas no se están usando, y entonces libera el espacio ocupado por esa cosa.
¿A que es muy chulo el recolector de basuras? Usando un símil, hemos comprado un par de cosas (objeto1 y objeto2) y las hemos metido en la habitación (memoria), yo estaba usando el coche, y mi colega la consola, y ha habido un momento en que no me he podido resistir a jugar a la consola, y nos hemos puesto a echar unas partidas, pero es que además dejé el coche por ahí, y claro, ahora cuando preguntamos donde está el coche, nadie sabe dónde está, y automáticamente cuando el recolector ve eso, coge y lo tira, porque sabe que aparte de que no lo estoy usando, posiblemente no lo use en un futuro y entonces lo deshecha para dejar espacio por si el día de mañana compro otra cosa que vaya a usar, la única manera de haber resuelto esto sería de haber dejado a alguien a cargo del coche, pero fui tan despistado que no lo hice, y ahora lo he perdido y me lo han tirado a la basura.
En conclusión, la verdad es que el recolector de basuras es muy útil para cuando tienes programas lo suficientemente grandes como para perder el control de todos los objetos que vas creando en la memoria, ya que es muy común que se te olvide liberar ese espacio, entonces como ya está todo pensado porque con muchas cosas a nuestro alrededor solemos ser más despistados, así que, lo mejor es ser cuidadoso con los objetos que se crean y tener claro que se van a usar, porque este proceso tiene una lógica por detrás que es fácil de entender pero lenta si tiene mucho volumen de cosas, y esta gestión nos puede penalizar en tiempo de ejecución a las aplicaciones que tengamos, puede que sea curioso tratar otro día como el recolector realiza esa gestión y por qué puede ser catastrófico si tenemos muchas cosas y no tenemos control sobre ellas, así que ya sabéis, no seáis despistados, incluso si hay alguien detrás que lo hace todo por vosotros.
¡Saludos Programadores!