¿Existe realmente el Objeto Inmortal?

En este artículo: Xamarin – Use referencias débiles para prevenir objetos inmortales Se dice que si dos objetos se refieren fuertemente, se harán imortales, lo que significa que el GC no puede recogerlos, incluso si los objetos ya no están en uso por la aplicación.

Sin embargo, en estas dos discusiones de SO:

Recolector de basura y referencia circular

Las referencias circulares causan fugas de memoria?

Parece que la referencia circular puede ser manejada por GC, siempre y cuando los objetos ya no estén en uso por la aplicación.

¿Me equivoco? ¿El GC de Java se comporta de manera diferente en Android? Estoy realmente confundido. Los comentarios son appriatiated. ¡Gracias!

No estoy seguro de su pregunta sobre qué idioma o entorno le interesa, pero en Java, no hay "objetos inmortales" del tipo que usted describe. La recolección de basura de Java no se basa en el recuento de referencias: se basa en la accesibilidad desde la raíz. Dado que sus dos objetos no se mencionan en ningún otro lugar de la aplicación, son elegibles para la recolección de basura.

Xamarin se basa en Mono , que es esencialmente una (ahora) implementación independiente de .NET. Y al igual que .NET, basa la recolección de basura en la accesibilidad, no en el conteo o presencia de referencias. (Lo mismo ocurre con el sistema Java GC, pero dado que Xamarin no está basado en Java, eso no es realmente el punto.)

Dos objetos que se refieren entre sí, pero son inaccesibles en el programa, son elegibles para la recolección de basura. No es necesario utilizar referencias débiles para abordar ese escenario, ya que los objetos se recogerán tan pronto como ambos objetos no puedan ser alcanzados por una referencia "root".

En otras palabras, el artículo que está viendo es claramente incorrecto. De hecho, el uso de referencias débiles puede conducir a otros problemas, ya que mantener objetos vivos se vuelve más complicado, por lo que es más fácil escribir errores en el código de uno. Me sorprende que tal información errónea aparezca en el propio sitio web de Xamarin.

Hice algunas investigaciones y quería responder a mi propia pregunta. A continuación se presentan algunos hallazgos:

  • En Java y C # mundo, referencia circular no es un problema. GC puede manejar eso muy bien. Por lo tanto, para Xamarin Android, ese artículo es irrelevante y engañoso. Sin embargo, ese artículo aparece en …
  • En Obj-C o el mundo rápido, utilizan el conteo de la referencia. Y las referencias circulares ciertamente causarán fugas de memoria. Así que en Xamarin.IOS tenemos que tener cuidado con eso. ACTUALIZACIÓN: Gracias al comentario de PeterDuniho, para ser exactos, para Xamarin.IOS, el mundo administrado está gobernado por Mono, no tenemos que preocuparnos por los círculos. Pero si dos objetos nativos fuertes se refieren unos a otros, se convertirán en inmortales … 😱😱😱

Creo que eso es todo. Enlace algunas referencias sobre este tema:

  • Xamarin Evolve 2013: Administración de memoria avanzada en iOS y Android
  • ¿Por qué Apple Swift no adopta el método de gestión de memoria de recolección de basura como en Java?
  • ¿Por qué no puedo instanciar este Fragmento en Android?
  • Imagen umbral con opencv (Java)
  • Manifiesto de Android: filtro y actividad de intenciones
  • Android - ¿Está bien poner valores @IntDef dentro de @interface?
  • Evento cuando la aplicación se instala (Android)
  • Un ClassCastException acerca de la clase anónima (java)
  • WebView y Cookies en Android
  • Error al obtener el ID del anunciante
  • Android: No se encontró identificador de recurso para el atributo 'headerView'
  • Anidados if / else, switches o algo más eficiente para el combate RPG?
  • ¿Cuándo son TODOS los casos en que se llama al método onSaveInstanceState ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.