miércoles, 18 de febrero de 2009

Eliminar Objetos no Utilizados en Java



Muchos otros lenguajes orientados a objetos necesitan que se siga
la pista de los objetos que se han ceado y luego se destruyan
cuando no se necesiten. Escribir código para manejar la memoria de
esta es forma es aburrido y propenso a errores. Java permite
ahorrarse esto, permitiéndo crear tantos objetos como se quiera
(sólo limitados por los que el sistema pueda manejar) pero nunca
tienen que ser destruidos. El entorno de ejecución Java borra los
objetos cuando determina que no se van autilizar más. Este proceso
es conocido como recolección de basura.

Un objeto es elegible para la recolección de basura cuando no existen
más referencias a ese objeto. Las referencias que se mantienen en una
variable desaparecen de forma natural cuando la variable sale de su
ámbito. O cuando se borra explicitamente un objeto referencia mediante
la selección de un valor cuyo tipo de dato es una referencia a null.

Recolector de Basura

El entorno de ejecución de Java tiene un recolector de basura que
periódicamente libera la memoria ocupada por los objetos que no se van
a necesitar más. El recolector de basura de Java es un barredor de
marcas que escanea dinamicamente la memoria de Java buscando
objetos, marcando aquellos que han sido referenciados. Después de
investigar todos los posibles paths de los objetos, los que no están
marcados (esto es, no han sido referenciados) se les conoce como
basura y son eliminados.

El colector de basura funciona en un thread (hilo) de baja prioridad y
funciona tanto síncrona como asíncronamente dependiendo de la situación
y del sistema en el que se esté ejecutando el entorno Java.

El recolector de basura se ejecuta síncronamente cuando el sistema
funciona fuera de memoria o en respuesta a una petición de un
programa Java. Un programa Java le puede pedir al recolector de basura
que se ejecute en cualquier momento mediane una llamada a System.gc().

Nota: Pedir que se ejecute el recolector de basura no
garantiza que los objetos sean recolectados.

En sistemas que permiten que el entorno de ejecución Java note cuando
un thread a empezado a interrumpir a otro thread (como Windows
95/NT), el recolector de basura de Java funciona asíncromamente
cuando el sistema está ocupado. Tan pronto como otro thread se vuelva
activo, se pedira al recolector de basura que obtenga un estado
consistente y termine.

Finalización

Antes de que un objeto sea recolectado, el recolector de basura le da
una oportunidad para limpiarse él mismo mediante la llamada al método
finalize() del propio objeto. Este proceso es conocido como finalización.
Durante la finalización un objeto se podrían liberar los recursos del
sistema como son los ficheros, etc y liberar referencias en otros objetos
para hacerse elegible por la recolección de basura.

El método finalize() es un miembro de la clase java.lang.Object. Una
clase debe sobreescribir el método finalize() para realizar cualquier
finalización necesaria para los objetos de ese tipo.

No hay comentarios: