La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Qué significa la recolección de basura en Java?

¿Qué significa la recolección de basura en Java?

Garbage Collection GC (Garbage Collection) es una de las tecnologías centrales del lenguaje Java. Anteriormente hemos discutido las nuevas características del nuevo recolector de basura G1 en Java 7, pero en términos del mecanismo operativo interno. Desde el punto de vista de JVM, los principios y mecanismos de recolección de basura de Java no han cambiado. El propósito de la recolección de basura es eliminar objetos que ya no se utilizan. El GC determina si recopilar un objeto determinando si un objeto activo hace referencia a él. El GC primero debe determinar si el objeto está listo para ser recolectado. Dos métodos comúnmente utilizados son el recuento de referencias y el recorrido de referencias de objetos.

Recolector de recuento de referencias

El recuento de referencias es una estrategia temprana en los recolectores de basura. En este enfoque, cada objeto (no una referencia) en el montón tiene un recuento de referencias. Cuando se crea un objeto y se asigna a una variable, el recuento de variables se establece en 1. Cuando a cualquier otra variable se le asigna una referencia a este objeto, el recuento se incrementa en 1 (a = b, entonces el objeto al que hace referencia b es 1), pero cuando una referencia a un objeto caduca o se establece en un nuevo valor, se disminuye la referencia del objeto cuenta en 1. Cualquier objeto con un recuento de referencia de 0 puede ser recolectado como basura. Cuando un objeto se recolecta como basura, el recuento de los objetos al que hace referencia se reduce en uno.

Ventajas: el recopilador de recuento de referencias se puede ejecutar rápidamente y está entrelazado con la ejecución del programa. Es más beneficioso para entornos en tiempo real donde el programa no se interrumpe durante mucho tiempo.

Desventajas: No se pueden detectar referencias circulares. Si el objeto padre tiene una referencia al objeto hijo, el objeto hijo a su vez hace referencia al objeto padre. De esta manera, su recuento de referencias nunca puede ser 0.

Recolector de seguimiento

Las primeras JVM usaban el recuento de referencias y ahora la mayoría de las JVM usan el recorrido de referencia de objetos. El recorrido de referencia de objetos comienza a partir de un conjunto de objetos y determina de forma recursiva los objetos alcanzables a lo largo de cada enlace en todo el gráfico de objetos. Si no se puede acceder a un objeto desde uno (al menos uno) de estos objetos raíz, se recolecta como basura. Durante la fase de recorrido del objeto, el GC debe recordar qué objetos son accesibles para poder eliminar los objetos inalcanzables. Esto se denomina marcar objetos.

El siguiente paso es que el GC elimine los objetos inalcanzables. Al eliminar, algunos GC simplemente escanean la pila, eliminan los objetos no marcados y liberan su memoria para generar nuevos objetos. El problema con este enfoque es que la memoria se divide en muchos segmentos pequeños, que no son lo suficientemente grandes para el nuevo objeto, pero la combinación es grande. Por lo tanto, muchos GC pueden reorganizar y compactar objetos en la memoria para formar espacio utilizable.

Por este motivo, el CG necesita detener otras actividades. Este enfoque significa que todo el trabajo relacionado con la aplicación se detiene y solo se ejecuta el GC. Como resultado, se agregan y eliminan muchas solicitudes mixtas durante el tiempo de respuesta. Además, se agregan continuamente o se ejecutan simultáneamente GC más complejos para reducir o eliminar las interrupciones de las aplicaciones. Algunos GC utilizan un solo subproceso para completar este trabajo, mientras que otros utilizan varios subprocesos para aumentar la eficiencia.

Algunos recolectores de basura de uso común

◆Recolector de barrido de marcas

Este recolector primero atraviesa el gráfico de objetos y marca los objetos accesibles, y luego escanea la pila para encontrar los no marcados. objetos y liberar su memoria. Este tipo de recopilador generalmente utiliza un solo subproceso para funcionar y detiene otras operaciones. Además, debido a que solo borra los objetos no marcados y no comprime los objetos marcados, generará una gran fragmentación de la memoria, desperdiciando así memoria.

◆Mark-Compact Collector

A veces también se le llama Mark-Sweep-Compact Collector, que tiene la misma fase de marcado que Mark-Sweep Collector. En la segunda fase, el objeto marcado se copia a una nueva área de la pila para comprimir la pila. Este recopilador también detiene otras operaciones.

Recolector de copias

Este tipo de recopilador divide la pila en dos áreas, a menudo llamadas medios espacios. Cada vez solo se utiliza la mitad del espacio y los nuevos objetos generados por la JVM se colocan en la otra mitad del espacio.

Cuando se ejecuta el GC, copia los objetos accesibles en la otra mitad del espacio, comprimiendo así la pila. Este método es adecuado para objetos de corta duración. La copia continua de objetos de larga duración reducirá la eficiencia. Y para un montón de tamaño determinado, se requiere el doble de memoria porque solo se utiliza la mitad en cualquier momento.

Recolector incremental

El recolector incremental divide la pila en múltiples dominios y solo recolecta basura de un dominio a la vez. También puede entenderse como dividir la pila en partes pequeñas. bloques, solo se recolecta basura un bloque a la vez. Esto da como resultado una pequeña interrupción de la aplicación, por lo que el usuario generalmente no se da cuenta de que el recolector de basura está funcionando.

Recopilador generacional

La desventaja del recopilador de copias es que cada vez que se recopilan, se deben copiar todos los objetos marcados, lo que da como resultado que se devuelvan algunos objetos con un ciclo de vida largo. varias veces consume mucho tiempo. El recopilador generacional puede resolver este problema. El recopilador generacional divide la pila en dos o más dominios para almacenar objetos con diferentes vidas útiles. Los nuevos objetos generados por la JVM generalmente se colocan en uno de los campos. Después de un período de tiempo, los objetos que continúan existiendo (objetos que no tienen una vida útil corta) adquirirán una vida útil y serán transferidos a un dominio de vida más larga. Los recopiladores generacionales utilizan diferentes algoritmos para diferentes dominios para optimizar el rendimiento.

Recolector paralelo

Los recopiladores paralelos utilizan algún algoritmo tradicional y utilizan múltiples subprocesos para realizar su trabajo en paralelo. El uso de tecnología de subprocesos múltiples en máquinas con múltiples CPU puede mejorar significativamente la escalabilidad de las aplicaciones Java.

Finalmente, se publica un ejemplo muy simple del recopilador de seguimiento para que todos puedan profundizar su comprensión del recopilador:

Ilustración del recopilador de seguimiento

Utilice cosas para preste atención con el recolector de basura

A continuación se presentarán algunas cosas a las que debe prestar atención con el recolector de basura. Aquí hay mucho conocimiento sobre el recolector de basura. :

◆ El método finalize() solo se puede llamar una vez por objeto. Si se produce una excepción cuando se ejecuta el método finalize(), el recolector de basura aún puede recolectar el objeto.

◆El recolector de basura rastrea cada objeto, recopila aquellos objetos intocables (es decir, el programa ya no hace referencia al objeto) y recupera el espacio de memoria que ocupa. Pero durante la recolección de basura, el recolector de basura llamará al método finalize() del objeto (si existe). Si el programa hace referencia al objeto en el método finalize() (comúnmente conocido como resucitado), el objeto se convierte en un objeto táctil y no será recolectado como basura por el momento. Sin embargo, dado que el método finalize() sólo se puede llamar una vez por objeto, cada objeto sólo se puede "resucitar" una vez.

◆El lenguaje Java permite a los programadores agregar un método finalize() a cualquier método, que será llamado antes de que el recolector de basura intercambie el objeto reciclado. Pero no confíe demasiado en este método para reciclar y reutilizar recursos del sistema, porque los resultados de la ejecución después de llamar a este método son impredecibles.

◆El recolector de basura no se puede forzar, pero los programadores pueden sugerir la recolección de basura investigando el método System.gc. Recuerde, estas son sólo sugerencias. Generalmente no se recomienda escribir System.gc usted mismo porque aumentará la carga de trabajo de la recolección de basura.