Existen lenguajes de programación en los cuales se proporcionan funciones para liberar la memoria de datos que ya no son útiles durante la ejecución de nuestra aplicación, java posee una herramienta totalmente automática para estos casos llamada “recolector de basura” (garbage collector) saber la forma en que esta elige objetos para recolectarlos y liberar memoria es primordial. Se debe aclarar que lo que a continuación escribiré es solo para marcar objetos como “elegibles” para ser recolectados y no garantiza de ninguna forma que el recolector de basura se ejecute (eso es tarea de la JVM).
Marcar objetos para ser elegibles (para el recolector de basura)
Reasignar variables
Un objeto es elegible cuando no existe un hilo vivo en el que exista alguna referencia hacia el. Como saben un programa en java por lo menos tiene un hilo de control (donde esta el main) veamos un simple ejemplo
public class Objeto{
public static void main(String[] args){
Objeto o = new Objeto();
/* algunas cosas*/
o = null;
//otras
}
}
En el ejemplo anterior existe un objeto tipo “Objeto” referenciado por la variable “o”, cuando “o” pierde la referencia (cuando se le asigna el null), se pierde también cualquier forma de acceder al objeto, de modo que pasa a ser elegible para el recolector de basura.
Otro ejemplo
public class Objeto{
public static void main(String[] args){
Objeto o = new Objeto();
objeto o1=o;
/* algunas cosas*/
o = null;
//otras cosas
}
}
En este segundo ejemplo el objeto creado no pasa a ser elegible pues aunque variable o pierde referencia hacia el objeto la variable o1 guarda aun una referencia hacia él.
Otro ejemplo
public class Objeto{
public static void main(String[] args){
Objeto o = new Objeto();//1
/* algunas cosas*/
o = new Objeto();//2
//algunas cosas mas
}
}
En este otro ejemplo la variable o es reasignada(//2) por lo tanto se pierde cualquier referencia al objeto creado al principio (//1) por lo que el objeto creado en la linea 1 pierde toda referencia hacia el y pasa a ser elegible para el recolector.
Alcance de las variables
public class Objeto{
public static void main(String[] args){
if(true){
Objeto o = new Objeto();//1
//otras cosas
}
/*Aquí ya no vive*/
}
}
En este último caso la variable “o” es local dentro de la sentencia if, al ejecutarse la línea comentada con “Aquí ya no vive”, la variable “o” ya no existirá así como tampoco existirá ninguna referencia al objeto creado en la línea 1.
El método System.gc();
Sirve para invocar al recolector de basura, no se garantiza de ninguna forma que se ejecute, es decisión de la JVM y si esta decide ignorar tu petición la ignora y ya.
El método finalize()
Es un método heredado de Object (ósea que todos los objetos lo tienen) que se manda llamar cuando un objeto es “recolectado”, puedes sobrescribirlo pero no hay garantía alguna de que se ejecute (se ejecutara máximo una vez).
Podrias poner referencias bibliográficas ?
ResponderEliminar