= { ... }

miércoles, marzo 14, 2007

Sacar la basura

Java, gracias a dios, abstrae al programador de la tarea de gestionar la memoria. Pero como todo en la vida, esto tiene un precio: alguien se tiene que encargar de ello por nosotros. Quien? Garbaje Collector (GC en adelante), o como yo lo llamaría el camión de la basura. Camión de la basura? Joder, este tío se ha vuelto idiota. Pues no. La analogía tiene cierto sentido:

Si vemos al GC como un camión de la basura, entonces que somos nosotros? Pues ni más ni menos el hijo pequeño que se encarga de sacar la basura de su familia hasta el contenedor mas próximo. Como? Si, en nuestro código podemos tirar objetos a la basura. Dos maneras:

  1. miObjeto = null;
  2. miObjeto = new OtraClaseViable();
De las dos formas consigo que el objeto al que apuntan las variables se quede sin referencias. Ya hemos caminado hasta el cubo, arrojado la bolsa en el cubo, e incluso cerrado la tapa.
El problema esta en que el camión pasará cuando le venga en gana, o puede que incluso no pase. Así es el GC: imprevisible. Alguna solución? Si, podemos tratar de llamar al ayuntamiento para avisar de que queremos que se recoja la basura. Dos maneras:
  1. System.gc();
  2. Runtime.getRuntime().gc();
El ayuntamiento pasará el aviso al camión de la basura (GC), que otra vez volverá a pasar o no, según le venga en gana. En general pasará, pero no se puede confiar en él.

Un último punto, que pasa si queremos asegurarnos de que lo que tiro a la basura no se lleva consigo cosas de valor? Podemos decir al basurero que abra la basura y compruebe que no quede nada de valor. En que se traduce esto: sobrescribir el método finalize(). Este método garantiza que será invocado antes de que el objeto sea llevado por el camión de la basura al vertedero, aunque con varias peculiaridades:
  1. finalize() solo será invocado una única vez: si reclamamos nuestro objeto de vuelta, la próxima vez que se marque como basura el método finalize() no se ejecutará.
  2. no te fíes del basurero y menos del finalize(), si tiras algo a la basura asegúrate antes de que realmente no se lleva nada de valor, sin esperar o confiar en este método.
Por algo de valor, me refiero por ejemplo a alguna conexión abierta (de cualquier tipo), un recurso no liberado, etc.

Día inspirado ;)

Para tutoriales de verdad :
  1. http://java.sun.com/docs/hotspot/gc1.4.2/
  2. http://www-128.ibm.com/developerworks/library/j-jtp01274.html

newuni @ delicious