JavaRush /Blog Java /Random-ES /Más sobre el recolector de basura en Java

Más sobre el recolector de basura en Java

Publicado en el grupo Random-ES
¡Hola! En la última conferencia, conocimos por primera vez el mecanismo integrado del lenguaje Java: el recolector de basura. Opera en segundo plano mientras su programa se ejecuta, recopilando objetos que se han vuelto innecesarios y que luego serán eliminados. De esta forma se libera memoria para crear nuevos objetos en el futuro. En esta conferencia veremos más de cerca el principio de su funcionamiento. Por ejemplo, ¿cómo y en qué momento un objeto se vuelve innecesario? ¿Y cómo sabe esto el recolector de basura? Responderemos estas preguntas :) Nuestra conferencia es más bien una descripción general: no es necesario memorizar este material. Está destinado a ampliar tus horizontes en cuanto al trabajo de la memoria y el recolector de basura, por lo que bastará con leerlo y aprender algo nuevo por ti mismo :) ¡Vamos! Lo primero que debe recordar es que el recolector de basura se ejecuta en paralelo con su programa . No forma parte de él y funciona por separado: para describir esto, en la última conferencia hicimos una analogía con un robot aspirador. De hecho, este no fue siempre el caso. Anteriormente, el recolector de basura estaba diseñado de tal manera que funcionaba en el mismo hilo que su programa. Y según un cronograma, cada pocos minutos comenzó a comprobar la presencia de objetos innecesarios en el programa. El problema fue que durante esta verificación y recolección de basura, el programa se congeló y no se ejecutó. Imagínese que está sentado en una oficina trabajando. Pero entonces llega una señora de la limpieza y necesita lavar el suelo de la habitación. Ella te echa de detrás de la computadora durante 5 minutos y esperas hasta que termine de limpiar. Durante este tiempo no puedes trabajar. Así es como solían funcionar los recolectores de basura :) Más tarde, este mecanismo se cambió y ahora el recolector de basura funciona en segundo plano, sin ralentizar el trabajo del programa en sí. Ya sabes que un objeto muere cuando ya no quedan referencias a él. Pero el recolector de basura en realidad no cuenta las referencias a . En primer lugar, puede ser bastante largo. 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 hacen referencia entre sí, pero nadie más hace referencia a ellos. Es decir, no son necesarios para que funcione el resto del programa. Si el recolector de basura simplemente contara las referencias, estos 3 objetos permanecerían y no liberarían memoria: ¡hay referencias a ellos! Se puede comparar con una nave espacial. Durante el vuelo, los astronautas decidieron comprobar la lista de repuestos para reparaciones y encontraron entre ellos un volante y pedales de un coche normal. Claramente no son necesarios aquí y ocupan espacio adicional. Aunque estas piezas están conectadas y tienen algunas funciones, en el marco del funcionamiento de la nave espacial son basura innecesaria, de la que es mejor deshacerse. Por lo tanto, Java decidió crear la base para la recolección de basura sin contar las referencias, sino dividiendo los objetos en dos tipos: accesibles e inalcanzables.. ¿Cómo determinar si un objeto es accesible? Todo lo ingenioso es simple. Un objeto es accesible si otro objeto accesible hace referencia a él. Esto da como resultado una "cadena de accesibilidad". Comienza cuando se inicia el programa y continúa durante toda su duración. Se parece a esto: Más sobre el recolector de basura - 4La flecha en la figura indica el código de ejecución de nuestro programa. En el código, por ejemplo en el método main(), se crean referencias a objetos. Estos objetos pueden hacer referencia a objetos nuevos, aquellos a algunos más, etcétera. Se forma una cadena de enlaces de objetos . Si se puede llegar a un objeto a través de esta cadena de enlaces a un "enlace raíz", es decir, uno que se crea directamente en el código de ejecución, se considera accesible. En nuestra imagen están indicados en azul. Pero si un objeto se salió de esta cadena, es decir, ninguna de las variables en el código que se está ejecutando actualmente contiene referencias a él, y también es imposible llegar a él a través de la "cadena de enlaces", se considera inalcanzable. En nuestro programa, dos de estos objetos están marcados en rojo. Tenga en cuenta: estos objetos "rojos" tienen enlaces entre sí. Pero, como dijimos anteriormente, el recolector de basura moderno en Java no cuenta las referencias. Determina si un objeto es alcanzable o inalcanzable . Por tanto, los dos objetos rojos de la imagen se convertirán en su presa. Ahora veamos todo el proceso de principio a fin y, al mismo tiempo, veamos cómo funciona la memoria en Java :) Todos los objetos en Java se almacenan en un área de memoria especial llamada montón . En el lenguaje corriente, un “montón” es una montaña de objetos donde todo está desordenado. Pero el montón en Java no es así. Tiene una estructura muy lógica y razonable. Un buen día, los programadores de Java descubrieron que todos los objetos de sus programas se pueden dividir en dos tipos: relativamente simples , y "de larga duración" . Los objetos “de larga duración” son aquellos que han sobrevivido a muchas recolecciones de basura. La mayoría de las veces existirán hasta el final del programa. Como resultado, el montón común, donde se almacenan todos los objetos creados, se dividió en varias partes. La primera parte tiene un hermoso nombre: Edén (el bíblico “Jardín del Edén”). Este es un gran nombre porque aquí es donde van los objetos después de su creación. Es en esta parte donde se asigna memoria para nuevos objetos cuando escribimosnew. Se pueden crear muchos objetos y, cuando se acaba el espacio en esta área, comienza la primera recolección de basura "rápida". Hay que decir que el recolector de basura es muy inteligente y elige un algoritmo de trabajo dependiendo de lo que haya más en el montón: basura u objetos de trabajo. Si casi todos los objetos son basura, el recolector marca los objetos "vivos" y los mueve a otra área de memoria, después de lo cual el área actual se limpia por completo. Si hay poca basura y la mayor parte está ocupada por objetos vivos, marca la basura, la limpia y ordena los objetos restantes. Dijimos “el coleccionista marca los objetos “vivos” y los mueve a otra ubicación de la memoria”, pero ¿cuál? El área de memoria donde se transfieren todos los objetos que sobreviven al menos a una recolección de basura se llama Survival Space . Survival Space, a su vez, se divide en generaciones . A cada objeto se le asigna una generación en función de cuántas recolecciones de basura ha experimentado. Si lo hay, pertenece a la “Generación 1”, si es 5, a la “Generación 5”. Juntos, Eden y Survival Space forman un área llamada Young Generation . Además de la Generación Joven, hay otra área de memoria en el montón: la Generación Vieja (“vieja generación”). Estos son objetos de muy larga vida que han sobrevivido a muchas recolecciones de basura. Es más rentable almacenarlos por separado de todos los demás. Y sólo cuando el área de Vieja Generación esté llena, es decir. Incluso si hay tantos objetos de larga duración en el programa que no hay suficiente memoria, se realiza una recolección de basura completa. Procesa no sólo un área de memoria, sino en general todos los objetos creados por la máquina Java. Naturalmente, requiere mucho más tiempo y recursos. Por eso se decidió almacenar por separado los objetos de larga vida. Cuando en otras zonas se acaba el espacio, se realiza la llamada “recolección rápida de basura”. Cubre una sola zona, por lo que es más económico y rápido. Al final, cuando incluso la zona para los centenarios ya está atascada, entra en juego la limpieza completa. Por lo tanto, el ensamblador utiliza la herramienta más "pesada" sólo cuando ya no es necesaria. Esquemáticamente, la estructura del montón y la limpieza se ve así: Más sobre el recolector de basura - 5
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION