2010-04-06 20 views

Respuesta

17

Sí, puede, así es exactamente como weak references están diseñados para funcionar. La referencia débil es la raíz que tiene su objeto para la aplicación, aunque el objeto puede tener otras referencias fuertes es la referencia root que importa y dado que la referencia raíz es una referencia débil, el objeto será un candidato para la recolección de basura .

Para obtener más información, véase la documentación WeakReference clase:

objetos débiles de referencia, que no evitar que sus referentes de ser hecho finalizables, finalizada, y luego recuperados. Las referencias débiles son las más que se utilizan a menudo para implementar las correlaciones de canonización .

Supongamos que el recolector de basura determina en un cierto momento en el tiempo que un objeto es débilmente alcanzable. En que tiempo que atómicamente claro todas referencias débiles a ese objeto y todos los referencias débiles a cualquier otro objetos débilmente alcanzable desde el que ese objeto es accesible a través de una cadena de fuertes y suaves referencias . Al mismo tiempo, declarará finalizables todos los objetos de acceso débil como finalizables. Al mismo tiempo, o al , algún tiempo posterior pondrá en cola esas referencias débiles recientemente despejadas que están registradas con colas de referencia.

FYI, junto con WeakReference, Java ofrece otras dos subclases de Reference: SoftReference y PhantomReference.

+0

Nunca he escuchado la expresión referencia débil y parece que implica algún mecanismo. Si entiendo las cosas correctamente, la pregunta es si el motor será basura recolectada si nada hace referencia al automóvil. –

+1

@James P .: WeakReference es una clase en la API estándar de Java que proporciona un mecanismo especial, es decir, referencias que no impiden que un objeto sea elegible para la recolección de basura. –

1

Aquí hay una prueba de unidad que demuestra las referencias débiles. Tenga en cuenta que System.gc() no garantizará que el objeto recibirá basura recolectada y no debe confiar en él.

import junit.framework.TestCase; 

import java.lang.ref.WeakReference; 

public class WeakReferenceTest extends TestCase { 


    class Car { 

     Engine engine = new Engine(); 

    } 

    class Engine { 

    } 

    public void testWeakReferences() { 
     WeakReference<Car> carRef = new WeakReference<Car>(new Car()); 
     assertNotNull(carRef.get()); 
     System.gc(); 
     assertNull(carRef.get()); 
    } 

} 
+0

¿Qué significa exactamente la notación WeakReference ? –

+8

Esa llamada a System.gc() no garantiza que la última declaración sea verdadera. – Phil

+0

Es una parametrización de la clase genérica 'WeakReference ' en la que el parámetro de tipo 'T' es la clase' Car'. –

8

La instancia de coches podría ser el recolector de basura, pero no hay ninguna garantía de que se ser basura recogida en el siguiente ciclo de GC, o incluso que se recogerá en absoluto. Por ejemplo,

  • En algún momento antes de las carreras de GC, la aplicación podría llamar get en el WeakReference y guardar la referencia a la Car en (por ejemplo) un atributo de un objeto accesible. La instancia Car se vuelve completamente accesible y ya no es elegible para la recolección de elementos no utilizados.

  • Si el GC se ejecuta con el Car en el estado descrito, la especificación de JVM no garantiza que se detecte lo débilmente alcanzable en el próximo ciclo de GC.Por ejemplo, si un ciclo de GC dado solo recopila la última generación (y el Car se ha promovido a una generación anterior), el GC no determinará que es débilmente alcanzable.

  • Incluso cuando el GC rompe la referencia al Car en WeakReference, la instancia Car no se recupera inmediatamente. Por el contrario, la recuperación de la ahora inalcanzable Car probablemente suceda (después de una posible finalización) en un ciclo GC posterior.

Cuestiones relacionadas