CodeGym /Blog Java /Random-ES /Más sobre el recolector de basura
Autor
Milan Vucic
Programming Tutor at Codementor.io

Más sobre el recolector de basura

Publicado en el grupo Random-ES
¡Hola! En la última lección, primero nos familiarizamos con el recolector de basura incorporado de Java y obtuvimos una idea aproximada de cómo funciona. Funciona en segundo plano mientras su programa se está ejecutando, recopilando objetos innecesarios que se eliminarán más tarde. Por lo tanto, libera memoria que puede usarse para crear nuevos objetos en el futuro.
Más sobre el recolector de basura - 1
En esta lección, discutiremos con mayor detalle cómo funciona. Por ejemplo, ¿cómo y cuándo un objeto se vuelve innecesario? ¿Y cómo se entera el recolector de basura? Estas son preguntas que responderemos durante la lección de hoy :) La lección será más como una descripción general: no necesita aprender este material de memoria. La intención es principalmente expandir tu visión sobre cómo funcionan la memoria y el recolector de basura, así que solo lee y encuentra algo nuevo para ti :) ¡Vamos! Lo primero que debe recordar es que el recolector de basura funciona en paralelo con su programa. No es parte de su programa. Funciona por separado (en la última lección, lo comparamos con una aspiradora robot) Pero no siempre fue así. La recolección de basura solía realizarse en el mismo hilo que su programa. En algún horario (una vez cada pocos minutos), el recolector de basura verificaría la presencia de objetos no deseados en el programa. El problema era que el programa se bloqueaba (no se ejecutaba) durante esta verificación y recolección de elementos no utilizados. Imagina que estás sentado en tu oficina en el trabajo. Pero luego entra la señora de la limpieza a lavar los pisos. Ella lo aleja de su computadora durante 5 minutos y usted espera hasta que termine de limpiar. Durante este tiempo, no puede trabajar. Así es como solía funcionar la recolección de basura :) Este mecanismo se cambió más tarde, y ahora el recolector de basura se ejecuta en segundo plano, no impidiendo el trabajo del propio programa. Ya sabes que un objeto muere cuando ya no tiene referencias. En realidad,el recolector de basura no cuenta las referencias a objetos . En primer lugar, esto podría llevar mucho tiempo. En segundo lugar, no es muy eficaz. ¡Después de todo, los objetos pueden referirse entre sí! Más sobre el recolector de basura - 2La figura muestra un ejemplo en el que 3 objetos se refieren entre sí, pero nadie más se refiere a ellos. En otras palabras, el resto del programa no los necesita. Si el recolector de basura simplemente contara las referencias, estos 3 objetos no se recopilarían y la memoria no se liberaría (¡hay referencias a ellos!). Podemos comparar esto con una nave espacial. Durante el vuelo, los astronautas deciden consultar la lista de repuestos disponibles para reparaciones. Entre otras cosas, encuentran un volante y pedales de un automóvil normal. Obviamente, no son necesarios aquí y ocupan espacio innecesariamente (aunque estas dos partes están relacionadas entre sí y tienen algunas funciones). Pero dentro de la nave espacial, son basura inútil que debe desecharse. En consecuencia, en Java, se tomó la decisión de recolectar basura basándose no en el conteo de referencias,alcanzable e inalcanzable . ¿Cómo determinamos si un objeto es alcanzable? Todo es simplemente ingenioso. Un objeto es accesible si hace referencia a otro objeto accesible. Por lo tanto, obtenemos una "cadena de accesibilidad". Comienza cuando comienza el programa y continúa durante la duración del programa. Se parece a esto: Más sobre el recolector de basura - 3 La flecha en la figura indica el código ejecutable de nuestro programa. El código (por ejemplo, el main()método) crea referencias a objetos. Estos objetos pueden referirse a otros objetos, esos objetos a otros, y así sucesivamente. Esto forma una cadena de referencia.. Si puede rastrear a lo largo de la cadena desde un objeto hasta la "referencia raíz" (la creada directamente en el código ejecutable), entonces se considera accesible. Dichos objetos están marcados en negro en la imagen. Pero un objeto es inalcanzable si el objeto cae fuera de esta cadena, es decir, ninguna de las variables en el código que se está ejecutando hace referencia a él y no se puede alcanzar a través de la "cadena de referencia". En nuestro programa, dos de estos objetos están marcados en rojo. Tenga en cuenta que estos objetos "rojos" tienen referencias entre sí. Pero como dijimos antes, el recolector de basura moderno de Java no cuenta las referencias. Determina si un objeto es alcanzable o inalcanzable. Como resultado, se apoderará de los dos objetos rojos de la figura. Ahora veamos todo el proceso de principio a fin. Al hacerlo, también veremos cómo se organiza la memoria en Java :) Todos los objetos de Java se almacenan en un área especial de memoria llamada montón . En el lenguaje cotidiano, un montón suele ser una montaña de elementos, donde todo se entremezcla. Pero eso no es lo que es el montón en Java. Su estructura es muy lógica y razonable. En algún momento, los programadores de Java descubrieron que todos sus objetos se podían dividir en dos tipos: objetos simples y "objetos de larga duración".. Los "objetos de larga duración" son objetos que han sobrevivido a muchas rondas de recolección de basura. Suelen vivir hasta que finaliza el programa. Al final, el montón completo, donde se almacenan todos los objetos, se dividió en varias partes. La primera parte tiene un hermoso nombre: edén.(del bíblico "Jardín del Edén"). Este nombre es apropiado, porque aquí es donde terminan los objetos después de que se crean. Esta es la parte de la memoria donde se crean nuevos objetos cuando usamos la palabra clave new. Se pueden crear muchos objetos. Cuando esta área se queda sin espacio, comienza una recolección de basura "rápida" inicial. Debemos decir que el recolector de basura es muy listo. Elige un algoritmo basado en si el montón tiene más basura o más objetos vivos. Si casi todos los objetos son basura, el recolector marca los objetos vivos y los mueve a otra área de la memoria. Entonces el área actual se borra completamente. Si no hay mucha basura y el montón está formado principalmente por objetos vivos, el recolector marca la basura, la limpia y empaqueta los otros objetos juntos. Dijimos "un espacio de supervivencia . Un espacio de supervivencia , a su vez, se divide en generaciones . Cada objeto pertenece a una generación en particular, dependiendo de cuántas rondas de recolección de basura haya sobrevivido. Si un objeto ha sobrevivido a una ronda de recolección de elementos no utilizados, entonces se encuentra en la "Generación 1"; si es 5, entonces "Generación 5". Juntos, eden y un espacio de supervivencia forman un área llamada la generación joven . Además de la generación joven, el montón tiene otra área de memoria llamada generación anterior.. Esta es precisamente el área donde terminan los objetos de larga vida que han sobrevivido a muchas rondas de recolección de basura. Hay ventajas en mantenerlos separados de todos los demás. La recolección de basura completa se realiza solo cuando la generación anterior está llena, es decir, hay tantos objetos de larga duración en el programa que no hay suficiente memoria. Este proceso involucra más de un área de la memoria. En general, involucra todos los objetos creados por la máquina Java. Naturalmente, esto requiere mucho más tiempo y recursos. Esta es precisamente la decisión que se tomó de almacenar los objetos de larga vida por separado. La "recolección rápida de basura" se lleva a cabo cuando otras áreas se quedan sin espacio. Esto involucra solo un área, lo que lo hace más rápido y eficiente. Finalmente, cuando incluso el área de los objetos de larga duración está completamente llena, se activa la recolección de basura completa. Así, el recolector utiliza la herramienta "más pesada" sólo cuando es imposible evitarla. Aquí hay una representación visual de la estructura del montón y la recolección de elementos no utilizados: Más sobre el recolector de basura - 4
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION