2011-10-20 4 views
6

Voy a través del siguiente mensaje el referencias débiles en Java: -WeakReference no se devuelve un valor nulo, aunque no hay fuertes referencias al objeto real de referencia

Understanding Weak References.

Después de pasar por la porción teórica, tratando de probar la referencia débil para condición nula. Pero, cheque nulo de referencia débil nunca devuelve cierto en código siguiente: -

package com.weak; 

import java.lang.ref.WeakReference; 

class Widget{} 

public class WeakReferenceDemo { 

    public static void main(String[] args) throws InterruptedException { 

     Widget widget = new Widget() ; 
     WeakReference<Widget> valueWrapper = new WeakReference<Widget>(widget) ; 

     System.out.println(valueWrapper.get()); 

     //here strong reference to object is lost 
     widget = null ; 

     int count = 0 ; 

     //here checking for null condition 
     while(valueWrapper.get() != null){ 
      System.out.print("."); 
      Thread.sleep(432) ; 

      if(++count % 25 == 0) System.out.println(); 
     } 

     System.out.println(valueWrapper.get()); 
    } 
} 

Para sugerir, ¿por qué valueWrapper.get() no vuelve nula, aunque widget de referencia se asigna valor nulo .

Gracias.

+4

GC no es recuento de referencias, cuando anula esa referencia, el GC ni siquiera lo sabe aún, lo encontrará durante el próximo ciclo de GC. – harold

+0

@harold: upvoting. – mogli

Respuesta

11

En lugar de esperar la recolección de basura, intente llamarlo usted mismo con Runtime.getRuntime().gc(), luego verifique la referencia débil para null.

Los objetos alcanzables débilmente solo se recuperan cuando se ejecuta GC. Dado que su programa no crea más objetos en el montón, es posible que esto nunca suceda sin pedirle que se ejecute manualmente.

+0

Ahora, lo tengo. Gracias. – mogli

2

WeakReference.get() no devuelve un valor nulo hasta que el recolector de elementos no utilizados ha determinado que el objeto solo es débilmente alcanzable. Eso puede tomar algo de tiempo.

Cuestiones relacionadas