## Eliminar Objetos no Utilizados

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.

Ozito