Ho un oggetto, che avviso è mantenuto da un WeakReference. Ho rintracciato i suoi referenti usando SOS e SOSEX, ed entrambi confermano che questo è il caso (non sono un esperto SOS, quindi potrei sbagliarmi su questo punto).In che modo il Garbage Collector decide quando uccidere oggetti tenuti da WeakReferences?
La spiegazione standard WeakReferences è che il GC li ignora quando si fa i suoi spazza. Tuttavia, il mio oggetto sopravvive a una chiamata a GC.Collect (GC.MaxGeneration, GCCollectionMode.Forced).
E 'possibile per un oggetto a cui fa riferimento solo con un WeakReference per sopravvivere che la raccolta? C'è una collezione ancora più completa che posso forzare? Oppure, dovrei rivedere la mia convinzione che gli unici riferimenti all'oggetto sono deboli?
Update e Conclusione causa
La radice era che c'era un riferimento in pila che stava chiudendo l'oggetto. Non è chiaro il motivo per cui né SOS né SOSEX hanno mostrato tale riferimento. L'errore dell'utente è sempre una possibilità.
Nel corso della diagnosi della causa principale, ho fatto diversi esperimenti che hanno dimostrato che le WeakReferences per oggetti di seconda generazione possono rimanere intorno a un tempo sorprendentemente lungo. Tuttavia, un oggetto WRd 2nd gen non sarà valido per GC.Collect (GC.MaxGeneration, GCCollectionMode.Forced).
Gli oggetti non sono registrati da WeakReferences. Questo è esattamente il loro punto. Probabilmente c'è qualcos'altro che li tiene in vita. – zneak
Cosa succede quando chiami GC.GetGeneration (yourWeakReference)?Restituisce qualcosa o genera un'eccezione? – MusiGenesis
Cosa mostra! Gchandles e! Gcroot mostra? –