¿Qué es el recolector de basura Java?
El recolector de basura es un subproceso de daemon que libera memoria durante el tiempo de ejecución. La recolección de basura también se puede expresar como reciclaje de memoria. Principalmente en JVM, el recolector de basura de punto de acceso Oracle se utiliza debido a su eficiencia. El área de memoria en JVM donde se crean los objetos se llama montón. El montón se divide en dos partes:
- Espacio de generación joven
- Espacio de generación antiguo / permanente
La generación joven se divide nuevamente en 3 partes.
- Espacio Eden
- Sobreviviente de
- Sobreviviente a
Se ha dado una explicación más profunda en los siguientes puntos. Por ejemplo, si creó un caché en su programa y si el objeto de caché sobrevivió a muchos ciclos de GC, entonces entra en la generación anterior. El GC busca objetos que el programa ya no necesita y los destruye.
¿Por qué recolector de basura?
Antes de Java, dos de los lenguajes más populares eran C y C ++. En C nos encontramos con calloc (), malloc (), realloc () que asignará memoria de búfer y en C ++ tenemos destructores. Todas estas funciones son para la característica llamada gestión de memoria. Java proporciona el recolector de basura como gestión automática de memoria por las dos razones principales:
- Algunos objetos creados se vuelven inalcanzables
- Las referencias de objetos antiguos a objetos jóvenes solo existen en pequeños números.
La mejor práctica para usar un recolector de basura es establecer banderas en JVM.
Déjame darte un ejemplo para objetos inalcanzables
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
En el ejemplo anterior, Java creará un objeto de cadena y el alcance de ese objeto es solo eso si el bloque no se puede usar afuera. Por lo tanto, cuando la recolección de basura se ejecuta sobre esta clase, marcará 's' como objeto inalcanzable y no utilizado y lo eliminará.
Funciones en el recolector de basura
- Marcar: comienza desde el nodo raíz de su aplicación (principal), recorre el gráfico de objetos, marca los objetos a los que se puede acceder como vida.
- Eliminar / Barrido: Eliminar objetos inalcanzables. Cuando GC elimina objetos, crea un agujero en el montón haciéndolo inconsistente. Por lo tanto, se utiliza la compactación.
- Compactación: compacte la memoria moviéndose alrededor de los objetos y marcando la asignación contigua que fragmentada. Es una tarea que consume mucho tiempo.
¿Cómo funciona Java Garbage Collector?
- Hay dos tipos de objeto:
Objetos vivos: alcanzables (referencias de otro objeto)
Objetos muertos: inalcanzables (no referenciados desde ningún lugar)
- Todos los objetos recién creados se crean en el espacio de Eden (espacio de Young Generation).
- Una vez que el espacio Eden está lleno, se ejecuta un programa minorGC () en el espacio de Young Generation que marca todos los objetos no utilizados o muertos y los elimina de la memoria.
- Los objetos que sobrevivieron a este ciclo de GC se moverán a Survivor From space. Se repite el mismo proceso y esta vez cuando los objetos se mueven del espacio Eden a Survivor. Desde el espacio, GC verifica si está lleno, los objetos muertos se liberan y los objetos sobrevivientes también se moverán a Survivor.
- Este proceso se repite y si algunos objetos sobrevivieron a un umbral sin ciclos de GC, esos objetos se mueven al espacio de la antigua generación.
- En este escenario, JVM ejecuta la función majorGC () que se ejecuta a través del espacio de almacenamiento dinámico completo, identifica / marca objetos no utilizados (nulos o muertos) y barre todos estos objetos.
- Recuerde, el barrido de objetos del espacio de almacenamiento dinámico creará agujeros en la memoria, lo que provocará una pérdida de memoria. Para evitar este escenario, el recolector de basura implementa la compactación del espacio de memoria
Ejemplos de recolector de basura en Java
Ejemplo de system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Salida:
Objeto
Explicación del código anterior.
- En el código anterior, los dos objetos obj1 y obj2 apuntan a nulo, por lo que se almacenan en el espacio Eden con valores nulos y sin referencia
- El sistema gc () invocará un hilo de demonio de recolección de basura y ambos objetos se eliminarán del espacio.
Pros y contras
A continuación se presentan algunos pros y contras de Java Garbage Collector de la siguiente manera:
Pros de gc:
- La recolección de basura aumenta la eficiencia de la memoria ya que eliminará todos los objetos no utilizados y nulos
- Un recolector de basura es un proceso automático, por lo que el desarrollador puede no ocuparse de él, porque en otros idiomas sin un programador del recolector de basura tiene que ocuparse de un problema de memoria difícil de alcanzar.
Contras de gc:
- El recolector de basura ejecutará la función gc principal que se ejecutará a través de todo el espacio de almacenamiento dinámico, haciendo que su programa se acelere lentamente por algunos segundos.
- Este proceso llevará más tiempo de CPU haciendo que el sistema de código sea más lento.
- Si está trabajando en una aplicación que requiere una gran memoria, utilice las banderas JVM disponibles.
- Si el espacio de almacenamiento dinámico está lleno y los objetos no se pueden deslizar o agregar más, entonces Java elimina el Error de memoria, lo que ralentizará toda la aplicación y también puede causar pérdidas de memoria.
Artículos recomendados
Esta es una guía de ¿Qué es Java Garbage Collector? Aquí discutimos su funcionamiento junto con Funciones, ejemplos, pros y contras del recolector de basura Java. También puede consultar los siguientes artículos para obtener más información:
- Constructor y Destructor en Java
- Destructor en Java
- C # vs rendimiento de Java
- ¿Qué es la JVM?