En este artículo explicaremos qué es y cómo funciona el Garbage Collector.
Para entender el funcionamiento del Garbage Collector primero hay que entender cómo se administra la memoria en Java. Se dará una pequeña explicación al respecto.
Básicamente, cuando ejecutamos un programa en Java, el sistema operativo le reserva a la JVM, una zona de memoria libre lo suficiéntemente grande como para que la JVM pueda ejecutar el programa. Esta zona se divide en tres partes:
Donde se almacenan los datos del programa como las constantes y variables globales. El tamaño de esta zona es fijo y nada de lo que hay en la zona cambia durante la ejecución del programa.
Aqui se almacenan las variables locales, parámetros y métodos de retorno de los métodos, etc.
En esta memoria se encuentran todas la variables, parámetros y retornos que pueda generar una clase. Cuando un método termina, las variables se borran del stack.
El tamaño de esta zona también es fijo y se asigna al comienzo del programa. Como el stack no puede modificarse, si se llena, el programa puede acabar en un StackOverflowError.
Esta es la memoria “dinámica” de Java. Aquí es donde se crean los objetos y puede variar su tamaño creando y/o eliminando objetos.
Lo que se guarda en el stack, son referencias y primitivos. Las referencias pueden apuntar a objetos (que están almacenados en el heap).
En el heap están almacenados los objetos en si, y estos pueden crearse y eliminarse en tiempo de ejecución.
Imaginemos por ejemplo un programa que al apretar un botón crea un objeto. Es decir, la cantidad de objetos que se creen depende del usuario (si el usuario apreta tres veces el botón se van a crear tres objetos, si no lo apreta ninguna vez, ninguno, etc.). Entonces, ¿cómo podemos al iniciar el programa saber cuanta memoria dedicarle si no sabemos cuántos objetos se van a crear? bueno, para eso está el heap. Ya que se puede modificar su tamaño a medida que se crean objetos, pidiéndole más memoria al sistema operativo.
Nuestra aplicación tiene la siguiente clase:
class MyClass {
public static void main(String[] args) {
MyClass myObject;
myObject = new MyClass();
}
}Este programa, al ejecutarse, va a almacenar en el stack la variable local myObject, que es una referencia del tipo MyClass. Después, va a crear un objeto del tipo MyClass en el heap, y finalmente asignarle a la referencia myObject el objeto creado. La referencia myObject (en el stack) apuntará al objeto MyClass recién creado (en el heap).

Supongamos ahora que ahora nuestra aplicación tiene la siguiente clase:
class MyClass {
public static void main(String[] args) {
MyClass myObject;
myObject = new MyClass();
myObject = new MyClass();
}
}Cuando ejecutemos la aplicación la variable myObject apuntará a un objecto MyClass que está en la heap. Y en la siguiente línea, myObject apuntará a otro objecto MyClass.

Lo que ha ocurrido es que el primer objecto MyClass se ha quedado sin ninguna referencia desde el stack. En definitiva el objecto se ha quedado perdido y ocupando memoria.
El siguiente paso sería eliminar todos los objectos sin referencia que han quedado en la heap. Aquí es donde entra el Garbage Collector.
Para la liberación de memoria, Java cuenta con lo que se llama el Garbage Collector de ahora en adelante GC.
El GC se encarga de eliminar de la memoria todos los objetos que no están siendo utilizados por nuestra aplicación. Un objeto sin utilizar es todo aquél que no tenga referencias desde el stack hacia él.
El GC no está permanentemente liberando la memoria sino que pasa de vez en cuando durante la vida del programa. Aunque también se puede forzar desde la misma aplicación.
Comentarios recientes
8 weeks 1 day ago
22 weeks 2 days ago
27 weeks 5 days ago
36 weeks 3 days ago
44 weeks 2 days ago
51 weeks 5 days ago
1 year 3 days ago
1 year 12 weeks ago
1 year 12 weeks ago
1 year 15 weeks ago