Il fallimento nell'astrazione non è in realtà il fatto che la garbage collection non è deterministica, ma piuttosto nell'idea che gli oggetti siano "interessati" a cose a cui fanno riferimento e che non siano interessati a cose a cui non tengono Riferimenti. Per capire perché, considera lo scenario di un oggetto che mantiene un contatore della frequenza con cui viene dipinto un particolare controllo. Alla creazione, si iscrive all'evento "paint" del controllo e, a sua disposizione, annulla l'iscrizione. L'evento click incrementa semplicemente un campo e un metodo getTotalClicks()
restituisce il valore di quel campo.
Quando viene creato l'oggetto contatore, deve causare la memorizzazione di un riferimento a se stesso all'interno del controllo che sta monitorando. Al controllo non interessa davvero l'oggetto contatore, e sarebbe altrettanto felice se l'oggetto contatore, e il riferimento ad esso, cessassero di esistere, ma finché esiste il riferimento chiamerà il gestore eventi di quell'oggetto ogni volta si dipinge da solo. Questa azione è totalmente inutile per il controllo, ma sarebbe utile a chiunque vorrebbe mai invocare getTotalClicks()
l'oggetto.
Se, ad esempio, un metodo dovesse creare un nuovo oggetto "contatore di vernice", eseguire alcune azioni sul controllo, osservare quante volte il controllo è stato ridipinto e quindi abbandonare l'oggetto contatore di vernice, l'oggetto rimarrebbe abbonato anche all'evento anche se a nessuno sarebbe mai importato se l'oggetto e tutti i riferimenti ad esso fossero semplicemente svaniti. Gli oggetti non diventerebbero idonei per la raccolta, tuttavia, fino a quando non lo sarà il controllo stesso. Se il metodo fosse uno che verrebbe invocato molte migliaia di volte durante la vita del controllo [uno scenario plausibile], potrebbe causare un overflow della memoria ma per il fatto che il costo di N invocazioni sarebbe probabilmente O (N ^ 2) o O (N ^ 3) a meno che l'elaborazione dell'abbonamento non sia stata molto efficiente e la maggior parte delle operazioni in realtà non riguardasse alcun disegno.
Questo particolare scenario potrebbe essere gestito dando al controllo di mantenere un riferimento debole all'oggetto contatore piuttosto che uno forte. Un modello con abbonamento debole è utile, ma non funziona nel caso generale. Supponiamo che invece di voler avere un oggetto che monitora un singolo tipo di evento da un singolo controllo, si desiderasse avere un oggetto logger di eventi che monitorasse diversi controlli e che il meccanismo di gestione degli eventi del sistema fosse tale che ogni controllo necessitasse di un riferimento a un diverso oggetto logger eventi. In tal caso, l'oggetto che collega un controllo al logger eventi dovrebbe rimanere attivo solo finché entrambiil controllo monitorato e il logger eventi rimangono utili. Se né il controllo né il logger di eventi contengono un forte riferimento all'evento di collegamento, cesserà di esistere anche se è ancora "utile". Se uno dei due contiene un evento forte, la durata dell'oggetto di collegamento può essere inutilmente estesa anche se l'altro muore.
Se non esiste alcun riferimento a un oggetto in qualsiasi parte dell'universo, l'oggetto può tranquillamente essere considerato inutile ed eliminato dall'esistenza. Il fatto che esista un riferimento a un oggetto non implica che l'oggetto sia "utile". In molti casi, l'utilità effettiva degli oggetti dipenderà dall'esistenza di riferimenti ad altri oggetti che - dal punto di vista della GC - non sono totalmente correlati a loro.
Se gli oggetti vengono notificati in modo deterministico quando nessuno è interessato a loro, saranno in grado di utilizzare tali informazioni per assicurarsi che chiunque sia interessato a tale conoscenza sia informato. In assenza di tale notifica, tuttavia, non esiste un modo generale per determinare quali oggetti sono considerati "utili" se si conoscono solo l'insieme di riferimenti esistenti e non il significato semantico associato a tali riferimenti. Pertanto, qualsiasi modello che presupponga che l'esistenza o la non esistenza di riferimenti sia sufficiente per la gestione automatizzata delle risorse sarebbe condannato anche se il GC potesse rilevare immediatamente l'abbandono degli oggetti.