¿Cuáles son los algoritmos de recolección de basura en Java?
Los algoritmos de recolección de basura más utilizados son:
(1) Algoritmo de recuento de referencias:
Agrega un contador de referencia al objeto, siempre que haya una referencia. se alcanza, el valor del contador se incrementa en 1; cuando la referencia deja de ser válida, el valor del contador se reduce en 1 en cualquier momento y ya no se utiliza, y el recolector de basura recuperará la memoria utilizada por; el objeto.
El algoritmo de recuento de referencias es simple de implementar y muy eficiente. La tecnología COM de Microsoft, ActionScript, Python, etc. utilizan el algoritmo de recuento de referencias para la gestión de la memoria. Problema de referencias circulares entre objetos, por lo que Java no utiliza el algoritmo de recuento de referencias.
(2). Algoritmo de búsqueda de raíz:
Utilizando una serie de objetos denominados "GC Root" como punto de partida, busca hacia abajo desde estos nodos para buscar el camino recorrido. Se llama cadena de referencia. Cuando un objeto no tiene ninguna cadena de referencia conectada a la raíz del GC, el objeto es inalcanzable, el objeto no se puede utilizar y el recolector de basura recuperará la memoria que ocupa.
Los principales lenguajes de programación comerciales C#, Java y Lisp utilizan el algoritmo de búsqueda de raíz para la gestión de la memoria.
En el lenguaje Java, los objetos que se pueden utilizar como GC Root incluyen los siguientes objetos:
a. objeto.
b. El objeto al que hace referencia la propiedad estática de la clase en el área del método.
c.El objeto al que hace referencia la constante en el área del método.
d. El objeto de referencia del método local JNI en la pila de métodos locales.
El área del método Java se denomina generación permanente en la máquina virtual Sun HotSpot. Mucha gente cree que esta parte de la memoria no necesita ser reciclada. La especificación de la máquina virtual Java no proporciona recolección de basura. Sin embargo, en esta parte de la memoria, las constantes obsoletas y las clases inútiles en el área del método aún deben reciclarse para garantizar que no se produzca un desbordamiento de la memoria en la generación permanente.
Método para determinar constantes obsoletas: si una constante en el grupo de constantes no está referenciada por ninguna referencia, la constante es una constante obsoleta.
Determinación de clases inútiles:
(1). Todas las instancias de esta clase se han reciclado, es decir, no hay objetos de instancia de esta clase en el montón de Java.
(2). El cargador de clases que cargó esta clase ha sido reciclado.
(3).El objeto java.lang.Class correspondiente a esta clase no está referenciado en ninguna parte y no se puede acceder a los métodos de esta clase a través del mecanismo de reflexión en ninguna parte.
Algoritmos de recolección de basura de uso común en Java:
(1) Algoritmo de limpieza de marcas:
El algoritmo de recolección de basura más básico, el algoritmo se divide en. Fases de "marcar" y "borrar": primero marque todos los objetos que deben reciclarse y, una vez completado el marcado, todos los objetos marcados se reciclarán de manera uniforme.
El algoritmo de marcado y borrado tiene dos deficiencias: primero, problemas de eficiencia, la eficiencia de marcado y borrado no es alta. En segundo lugar, se generará una gran cantidad de fragmentos de memoria discontinuos después de borrar la marca. Demasiados fragmentos de espacio harán que el programa no pueda encontrar suficiente memoria contigua cuando necesite asignar memoria para objetos más grandes y tenga que activar otra acción de recolección de basura. avance.
(2). Algoritmo de copia:
Divida la memoria disponible en dos bloques de igual tamaño según la capacidad y solo use uno de ellos a la vez cuando este bloque de memoria. se agota, se devolverá. Copie los objetos supervivientes a otra parte de la memoria y luego limpie el espacio de memoria usado de inmediato. Esto permite reciclar una parte de la memoria cada vez. No es necesario considerar situaciones complejas como la fragmentación de la memoria al asignar memoria. Solo necesita mover el puntero superior del montón y asignar memoria en orden. y eficiente para funcionar.
Las deficiencias del algoritmo de copia son obvias y la memoria utilizable se reduce a la mitad del original.
(3). Algoritmo de organización de marcas:
El algoritmo de organización de marcas se ha mejorado con respecto al algoritmo de eliminación de marcas. La etapa de marcado es la misma y todos los objetos que deben eliminarse. Los reciclados están marcados. Una vez completado el marcado, los objetos reciclables no se limpian directamente, pero todos los objetos supervivientes se mueven a un extremo y los objetos reciclables se limpian durante el movimiento.
La ventaja del algoritmo organizador de marcas en comparación con el algoritmo de borrado de marcas es que no causará una gran cantidad de problemas de fragmentación discontinua de la memoria una vez organizada la memoria.
Cuando la tasa de supervivencia del objeto es alta, el algoritmo de copia realizará más operaciones de copia y la eficiencia será menor. Sin embargo, cuando la tasa de supervivencia del objeto es alta, la eficiencia del uso del algoritmo organizador de marcas. mejorará mucho.
(4). Algoritmo de recopilación generacional:
Dividir la memoria en varios bloques según los diferentes ciclos de supervivencia de los objetos en la memoria. En la máquina virtual Java, la memoria es. generalmente se divide en nuevos bloques. Cuando se crean nuevos objetos, el espacio de memoria generalmente se asigna en la nueva generación. Cuando el recolector de basura de nueva generación recolecta objetos que aún están vivos después de varias veces, se moverán a la memoria de la generación anterior. Los objetos están en la nueva generación. Cuando no se puede encontrar suficiente memoria contigua en la generación anterior, también se crea directamente en la generación anterior.