¿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:
- Vista Lista expandible - Childs, Diferentes diseños
- ¿Hay alguna manera de determinar en Android si se ha creado / visualizado la vista de contenido de una actividad?
- Error: Gradle: la ejecución falló para la tarea ': app: preDexDebug'
- ¿Cómo puedo comprobar si una aplicación se ejecuta en Android?
- ¿Cómo probar Volley Library en el estudio de Android?
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!
- Android: Administración de varias notificaciones en la barra de estado
- Espacio entre el scrollview anidado y la barra de herramientas de colapso android
- Android Studio - Error de sincronización de Gradle
- Obtener instancia de actividad
- Dos tipos de parámetros diferentes (cast Object to Type)
- Importar proyecto java de origen en el proyecto de Android
- Cómo establecer fillColor, StrokeWidth y StrokeColor de vector drawable programatically en Android
- Cómo establecer el valor mínimo y máximo de búsqueda
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?
- Reaccionar nativo para la navegación de Android geolocalización no se ejecuta
- Eliminar el foco de recyclerview dentro de Scrollview anidada