Recordar qué es la recolección de basura en Java

La recolección de basura es el proceso de recuperar la memoria de tiempo de ejecución completa mediante la destrucción de objetos no utilizados.

A veces, el programador puede olvidarse de destruir objetos inútiles y la memoria asignada a ellos no se libera. Cada vez se consume más memoria del sistema y finalmente no se asigna más. Tales aplicaciones sufren de "fugas de memoria".

Después de cierto punto, ya no hay suficiente memoria para crear nuevos objetos y el programa finaliza de manera anormal debido a OutOfMemoryError .

La recolección de basura en Java es el proceso mediante el cual los programas Java administran la memoria automáticamente. Los programas de Java se compilan en un código de bytes que se ejecuta en la máquina virtual de Java (JVM).

Cuando los programas Java se ejecutan en la JVM, los objetos se crean en el montón, que es la parte de la memoria que se les asigna.

Mientras se ejecuta una aplicación Java, se crean nuevos objetos en ella. Al final, algunos objetos ya no son necesarios. Podemos decir que en un momento dado, la memoria del montón consta de dos tipos de objetos.

  • En vivo : estos objetos se usan, se hace referencia a ellos desde otro lugar.
  • Muertos : estos objetos no se usan en ningún otro lugar, no hay referencias a ellos.

El recolector de elementos no utilizados encuentra estos objetos no utilizados y los elimina para liberar memoria.

La recolección de basura en Java es un proceso automático . El programador no necesita marcar explícitamente los objetos para eliminarlos.

Cada JVM puede implementar su propia versión de recolección de basura. Sin embargo, el recopilador debe cumplir con la especificación estándar de JVM para tratar con objetos presentes en la memoria del montón para marcar o identificar objetos inalcanzables y destruirlos mediante compactación.

Accesibilidad de objetos

Para reconocer un objeto como vivo, la presencia de enlaces no es suficiente. Esto se debe a que algunos objetos inactivos pueden hacer referencia a otros objetos inactivos. Por eso es necesario que entre todas las referencias a un objeto, haya al menos una de un objeto “vivo”.

Accesibilidad de objetos

Los recolectores de basura trabajan con el concepto de GC Roots ( raíces de recolección de basura ) para distinguir entre objetos vivos y muertos. Hay objetos 100% vivos ya partir de ellos hay enlaces que animan otros objetos y así sucesivamente.

Ejemplos de tales raíces:

  • Clases que carga el cargador de clases del sistema.
  • Transmisiones en vivo.
  • Parámetros de métodos actualmente en ejecución y variables locales.
  • Objetos que se utilizan como monitor para la sincronización.
  • Objetos que se retienen de la recolección de elementos no utilizados para algún propósito.
  • El recolector de basura recorre todo el gráfico de objetos en la memoria, comenzando en estas raíces y siguiendo las referencias a otros objetos.

Pasos de recolección de basura en Java

La implementación estándar de recolección de basura tiene tres pasos.

1. Marcar objetos como activos

En este punto, el recolector de basura (GC) debe identificar todos los objetos vivos en la memoria recorriendo el gráfico de objetos.

Cuando visita un objeto, lo marca como disponible y por lo tanto vivo. Todos los objetos a los que no se puede acceder desde las raíces del GC se consideran candidatos para la recolección de elementos no utilizados.

2. Limpiar objetos muertos

Después de la fase de marcado, el espacio de la memoria está ocupado por objetos vivos (visitados) o muertos (no visitados). La fase de limpieza libera los fragmentos de memoria que contienen estos objetos muertos.

3. Disposición compacta de los objetos restantes en la memoria.

No es necesario que los objetos muertos que se retiraron en la fase anterior estén uno al lado del otro. Por lo tanto, corre el riesgo de obtener un espacio de memoria fragmentado (medio vacío).

Pero, por supuesto, habiendo previsto esto, es posible compactar la memoria en el momento en que el recolector de basura elimina los objetos muertos. El resto se ubicará en un bloque contiguo al comienzo del montón.

El proceso de compactación facilita la asignación secuencial de memoria para nuevos objetos.