Syntactic y semantic garbage
El alcance de la definición de "basura" no es óptimo, por lo que las última vez que un programa usa un objeto podría ser mucho antes de que este caiga fuera del ámbito del ambiente.Una distinción es a veces delineadaentre "syntactic garbage", aquellos objetos que el programa no tiene la posibiladad de acceder, y "semantic garbage", aquellos objetos que de hecho el programa no usará jamás.
x = Foo.new y = Bar.new x = Quux.new
# en este punto, sabemos que el objeto Foo # originalmente asignado a x no será accedido nunca # esto es "syntactic garbage"
if x.check_something x.do_something y end
exit 0
# en el código de arriba "y" *podría* ser "semantic garbage" # pero no lo vamos a saber hasta que c.check_something retorne # algún valor -- si es que retorna alguno.
Referencias fuertes y débiles.
El GC puede reclamar solamente objetos que no tienen referencias apuntando hacia ellos tanto sea directa o indirectamente desde el conjunto raíz (root set). Por otro lado algunos programas requieren referencias débiles, las cuales deberían ser útiles tanto tiempo como el objeto exista pero no deberían prolongar su tiempo de vida. En discusiones acerca de referencias débiles las referencias ordinarias son a veces llamadas referencias fuertes. Un objeto es apto para ser recolectado por el GC si no hay referencias fuertes hacia este, aún pudiendo haber alguna referencia débil.
Una referencia débil no es simplemente cualquier puntero al objeto la cual al GC no le importa. El término es usualmente reservado para una categoria apropiadamente manejada de referencia especial a objetos los cuales son seguros de usar aún después de que el objeto desaparece porque apuntan a un valor seguro. Una referencia insegura que no es conocida por el GC simplemente va a continuar colgada y continuamente referenciando a la dirección dónde el objeto previamente residía. Esto no es una referencia débil.
En algunas implementaciones, las referencias débiles están dividas en subcategorías, Por ejemplo, la máquina virtual de java provee tres formas de referencias débiles, llamadas soft references [3], referencias fantasmas [4] y referencias débiles normales [5], Un objeto referenciado suavemente es únicamente apto para su reclamo, si el GC decide que el programa está bajo en memoria. Distinto a las referencias suaves o las referencias débiles normales, una referencia fantasma no provee acceso al objeto que esta referencia. En cambio, una referencia fantasma es un mecanismo que permite al GC notificar al programa cuando el objeto referenciado se convierte en una referencia fantasma.
[3] http://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html [4] http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html [5] http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html
Continuará....