una referencias referencia que matriz ejemplos cruzadas cruzada consulta biblia auditoria java

java - referencias - referencia cruzada word



Referencias cruzadas y recolección de basura (3)

La JVM opera con la noción de "islas de inalcanzabilidad". Si hay una ''isla'' inalcanzable de objetos interconectados, entonces ese conjunto de objetos es elegible para la recolección de basura en su totalidad.

Hay una aplicación con un extenso gráfico de objetos. Este gráfico consiste principalmente en un conjunto de subgrafos que están conectados al resto del gráfico a través de la única referencia. Pero internamente, cada uno de esos subgrafos tiene algunas referencias cruzadas entre objetos. De vez en cuando, un subgrupo debe descartarse. ¿Sería suficiente establecer para anular la única referencia que apunta a ese subgrafo para hacerlo elegible para la recolección de basura?

Mi preocupación es que las referencias cruzadas internas pueden "proteger" a todo el subgráfico de la recolección de basura. En otras palabras, es el recolector de basura lo suficientemente sabio como para darse cuenta de que todas las referencias en un subgrafo no salen de los limites del subgrafo y por lo tanto todo el subgrafo puede ser purgado.


Sí, el recolector de basura puede manejar referencias circulares, etc.


Como se indica en esta pregunta SO , la referencia circular está bien gestionada.

Java no hace recuento de referencias, sí "marca y barre" la recolección de basura. Si sigue todas las referencias activas para descubrir qué objetos son "alcanzables" y luego limpia todo lo demás.

Las referencias en objetos que no son alcanzables no afectan la accesibilidad, por lo que no importa si son nulas o no.

Sobre el único caso en el que establecer una referencia a null podría, posiblemente, tener un efecto significativo es descartar un objeto muy grande en medio de un método de larga ejecución.

En ese caso, establecer null a la referencia del gráfico ayudará a hacer una isla de aislamiento (incluso para referencias circulares internas) como se describe en este artículo .

Encontrará más detalles sobre el estado inalcanzable en The Truth About Garbage Collection :

Inalcanzable

Un objeto entra en un estado inalcanzable cuando no existen más referencias fuertes a él.
Cuando un objeto es inalcanzable, es un candidato para la recolección.

Tenga en cuenta la fraseología:
El hecho de que un objeto sea un candidato para la recopilación no significa que se recopilará inmediatamente. La JVM puede demorar la recopilación hasta que haya una necesidad inmediata de que el objeto consuma la memoria.

Es importante tener en cuenta que no solo cualquier referencia fuerte mantendrá un objeto en la memoria. Deben ser referencias que encadenan desde una raíz de recolección de basura. Las raíces de GC son una clase especial de variable que incluye:

  • Variables temporales en la pila (de cualquier hilo)
  • Variables estáticas (de cualquier clase)
  • Referencias especiales del código nativo JNI

Las referencias fuertes circulares no necesariamente causan fugas de memoria . Considere un código que crea dos objetos y les asigna referencias el uno al otro.

public void buidDog() { Dog newDog = new Dog(); Tail newTail = new Tail(); newDog.tail = newTail; newTail.dog = newDog; }

Antes de que el método regrese, hay referencias fuertes de las variables de la pila temporal en el método buildDog que apunta tanto al Perro como a la Cola.

Después de que el método buildDog regrese, tanto el perro como la cola se vuelven inalcanzables desde una raíz y son candidatos para la recopilación (aunque la VM podría no recopilar estos objetos por un tiempo indefinido).