2010-01-06 11 views
29

He estado tratando de entender la diferencia entre diferentes referencias, pero la teoría no provoca ninguna idea para que yo visualice lo mismo.¿Alguien puede explicar la diferencia entre las referencias Fuerte, Suave, Débil y Fantasma y el uso que se le da?

¿Alguien podría explicar brevemente las diferentes referencias?

Un ejemplo para cada uno sería mejor.

+3

Relacionado pero más estrecho en el alcance: http://stackoverflow.com/questions/299659/what-is-the-difference-between-a-soft-reference-and-a-weak-reference-in-java –

Respuesta

21

Otro buen artículo sobre el tema:
Java Reference Objects or How I Learned to Stop Worrying and Love OutOfMemoryError, con bonitas diagramas

http://www.kdgregory.com/images/java.refobj/object_life_cycle_with_refobj.gif

Extracto:

Como puede imaginar, agregando tres nuevos estados opcionales a th El diagrama del ciclo de vida del objeto es un desastre.
Aunque la documentación indica una progresión lógica de fuertemente accesible a través de soft, weak y phantom, para recuperarse, la progresión real depende de qué objetos de referencia crea su programa.
Si crea un WeakReference pero no crea un SoftReference, entonces un objeto progresa directamente de fuertemente accesible a débilmente alcanzable a finalizado a recopilado. objeto del ciclo de vida, con objetos de referencia

También es importante recordar que no se adjuntan todos los objetos para hacer referencia a objetos - de hecho, muy pocos de ellos debe ser.
Un objeto de referencia es una capa de direccionamiento indirecto: se pasa por el objeto de referencia para llegar al objeto referido, y claramente no se desea esa capa de direccionamiento indirecto en todo el código.
La mayoría de los programas, de hecho, usarán objetos de referencia para acceder a un número relativamente pequeño de los objetos que crea el programa.

Referencias y referentes

un objeto de referencia proporciona una capa de indirección entre su código de programa y algún otro objeto, llamado el referente.
Cada objeto de referencia se construye alrededor de su referente, y proporciona un método get() para acceder al referente. Una vez que crea una referencia, no puede cambiar su referente. Una vez que se ha recopilado el referente, el método get() devuelve null. las relaciones entre el código de aplicación, la referencia suave/débil, y referente

alt text


ejemplos aún más: Java Programming: References' Package

alt text http://www.pabrantes.net/blog/space/start/2007-09-16/1/referenceTypes.png

  • Caso 1: Este es el habitual caso donde se dice que Object es fuertemente accesible.

  • Caso 2: Hay dos rutas a Objeto, por lo que se elige la más fuerte, que es la que tiene la referencia fuerte por lo tanto, el objeto es muy accesible.

  • Caso 3: Una vez más hay dos rutas hacia el Objeto, la más fuerte es la Referencia Débil (ya que la otra es una Referencia Fantasma), por lo que se dice que el objeto es débilmente alcanzable.

  • Caso 4: Solo hay una ruta y el enlace más débil es una referencia débil, por lo que el objeto es débilmente accesible.

  • Caso 5: Solo una ruta y el eslabón más débil es la referencia fantasma, por lo tanto, el objeto es prácticamente alcanzable.

  • Caso 6: ahora hay dos rutas y la ruta más fuerte es la que tiene una referencia suave, por lo que ahora se dice que el objeto es accesible suavemente.

+1

+1 no solo para proporcionar una URL :) –

+0

Después de eso, para jugar con el modo de gc diferente: http://www.artima.com/insidejvm/ed2/gcP.html – VonC

+0

Programación de Java: el paquete de Referencias me explicó qué quise. Ahora tengo una idea clara de qué referencias son. –

3

Hay una regla muy simple:

  • objetos referenciados fuertemente son bits estándar de código como Object a = new Object(). Los Objetos referenciados no son basura siempre que la referencia (a, arriba) sea "alcanzable". Por lo tanto, cualquier cosa que no tenga referencia fuerte alcanzable puede considerarse como basura.

Así que luego nos fijamos en los no fuertes tipos de referencia:

  • débilmente referenciados- objetos conseguirá probablemente recogido por la JVM, tan pronto como se hacen elegibles para GC (y el WeakReference despejado) Una referencia débil a a se vería como new WeakReference<Object>(a). Las referencias débiles son útiles en el caso de que desee un caché donde los datos solo sean necesarios si las claves existen como poderosas en cualquier otro lugar (p. Ej., HttpSessions)
  • objetos con referencia débil probablemente se queden en la JVM hasta que sea absolutamente imposible necesita recuperar la memoria Las referencias suaves son útiles para las memorias caché donde los valores son de larga duración, pero se pueden recopilar si es necesario

¡Nunca estoy tan seguro de los fantasmas!

Cuestiones relacionadas