Tengo un objeto, que I cree que solo lo tiene WeakReference. He rastreado sus titulares de referencia usando SOS y SOSEX, y ambos confirman que este es el caso (no soy un experto en SOS, así que podría estar equivocado en este punto).¿Cómo decide el recolector de basura cuándo matar los objetos mantenidos por WeakReferences?
La explicación estándar de WeakReferences es que el GC las ignora al hacer sus barridos. No obstante, mi objeto sobrevive a una invocación a GC.Collect (GC.MaxGeneration, GCCollectionMode.Forced).
¿Es posible que un objeto al que solo se hace referencia con WeakReference sobreviva a esa colección? ¿Hay una colección aún más completa que pueda forzar? O, ¿debería volver a visitar mi creencia de que las únicas referencias al objeto son débiles?
actualización y conclusión causa
La raíz era que había una referencia en la pila que estaba bloqueando el objeto. No está claro por qué ni SOS ni SOSEX estaban mostrando esa referencia. El error del usuario siempre es una posibilidad.
En el curso del diagnóstico de la causa raíz, realicé varios experimentos que demostraron que las WeakReferences para objetos de 2ª generación pueden permanecer durante un tiempo sorprendentemente largo. Sin embargo, un objeto de segundo gen WRd no sobrevivirá a sobre GC.Collect (GC.MaxGeneration, GCCollectionMode.Forced).
Objetos _aren't_ en poder de WeakReferences. Ese es precisamente su punto. Es probable que haya algo más que los mantenga vivos. – zneak
¿Qué sucede cuando llamas a GC.GetGeneration (yourWeakReference)?¿Devuelve algo o arroja una excepción? – MusiGenesis
¿Qué muestra! Gchandles y! Gcroot show? –