¿Qué ocurre con WeakReference cuando el objeto de destino al que hace referencia WeakReference.Target ha sido recolectado? ¿El Weakrerence se mantiene vivo y sigue existiendo? La razón por la que estoy preguntando es que tengo una lista de WeakReferences almacenada en una lista. Durante el tiempo de ejecución, las nuevas WeakReferences se agregan constantemente a esa lista. Ahora cuando el objeto objetivo muere, ¿tengo que limpiar yo mismo la WeakReference abandonada? Si es así, ¿hay algún truco inteligente sobre cómo puedo hacer esto? ¿Puedo recibir una notificación cuando se abandona una WeakReference? O tengo que introducir un temporizador que recorre con frecuencia esa lista, para ver si alguna instancia de WeakReference puede eliminarse de esa lista.¿Qué ocurre con una WeakReference después de GC de WeakReference.Target
Respuesta
Este es un problema común con referencias débiles. La referencia en sí permanece viva porque tiene punteros normales. Como sugiere, necesita hacer una "recolección manual de basura" de vez en cuando. Tenga en cuenta que probablemente pueda limpiar los talones en su camino cuando atraviesa la lista por otro motivo. Dependiendo del patrón de uso para la lista, esta recolección de basura "en el lateral" puede ser suficiente.
¡No recorra "con frecuencia" la lista con el único propósito de limpiarla! Cada resguardo solo desperdicia un par de palabras de memoria. Si la lista no se usa a menudo, el costo computacional de limpiarlo a menudo no está justificado, y si se usa con frecuencia se limpiará a sí mismo como se sugirió anteriormente.
Está en otro sistema de recolección de basura en total, pero los problemas son tan similares que puede interesarle this article si puede obtenerlo.
Si no se accederá a la lista por índice, la mejor política es purgarla cuando se agreguen elementos, si el número de elementos que se han agregado entre la última purga y la última colección (use los contadores de GC) excede un cierto fracción del tamaño de la lista. Lo que importa normalmente no es que toda la basura se limpie, sino que la cantidad de basura que no es elegible para la recolección inmediata sigue limitada. Por cierto, las WeakReferences cuestan más que "un par de palabras". No son terriblemente caros, pero incluso un millón de refusores débiles sin usar pueden ahogar un programa. – supercat
Dado que tiene una referencia fuerte al objeto WeakReference, no recibirá GC'ed. Esto también es por diseño, ya que se pretendía que todavía pudieras usar WeakReference para descubrir que el objetivo ha sido GC.
Así que sí, tendrás que ir por el modo temporizador.
Agregado: También puede consultar Garbage Collection Notifications.
+1, pero advertiría contra las notificaciones de GC, ya que desactivan algunas de las características más nuevas (agradables) del GC. – user7116
El uso previsto es que registre una ReferenceQueue con WeakReferences. Cuando se recopila el objetivo, la referencia se agrega a la cola. Puede sondear o esperar en la cola y eliminar los objetos WeakReference de su Lista.
- 1. ¿Qué ocurre después de escribir en una variable volátil?
- 2. Probar/Verificar una WeakReference
- 3. OutOfMemoryErrors incluso después de usar WeakReference para claves y valores
- 4. Implementación de WeakReference en .NET
- 5. ¿Con qué frecuencia se ejecuta el GC?
- 6. Prueba de WeakReference
- 7. Uso de ReferenceQueue y WeakReference
- 8. Cuando ordeno una Lista, ¿qué ocurre con sus iteradores?
- 9. WeakReference understanding
- 10. ¿Qué registrar cuando ocurre una excepción?
- 11. ¿Qué ocurre con PERDIDO objetos String
- 12. Seguridad de subprocesos de WeakReference
- 13. Qué ocurre si selecciono SCOPE_IDENTITY() después de que falla una inserción (SQL Server 2005)
- 14. GC de delegados, ¿qué me estoy perdiendo? (mi delegado no se recoge)
- 15. ¿Por qué ocurre una recursión aquí?
- 16. ¿Qué ocurre con el restablecimiento de un grupo de aplicaciones?
- 17. ¿Qué ocurre en Excel?
- 18. WeakReference y manejo de eventos
- 19. ¿Qué ocurre si falta php.ini?
- 20. ¿WeakReference es un buen caché?
- 21. C#: ¿Notificación antes de recopilar WeakReference?
- 22. Configuración de Sinatra en Nginx: ¿qué ocurre?
- 23. ¿Qué está recolectando GC aquí?
- 24. Ejemplo simple de herencia C++, ¿qué ocurre?
- 25. Con "-fno-excepciones", ¿qué ocurre con "nueva T"?
- 26. ¿Qué ocurre al aumentar el tamaño de una matriz dinámica?
- 27. INotifyPropertyChanged: ¿qué ocurre detrás de la escena?
- 28. android: dither = "true" no tiembla, ¿qué ocurre?
- 29. Cómo contar cuántas veces ocurre un valor después de otra
- 30. Perl Regular Expression - ¿Qué significa modificador de gc?
Por cierto, buen trabajo en la redacción de la pregunta, sentí que estaba muy claro cuál era el problema aunque casi no tengo experiencia con .net. –