La falla en la abstracción no es en realidad el hecho de que la recolección de basura no es determinista, sino más bien la idea de que los objetos están "interesados" en cosas a las que tienen referencias, y no están interesados en cosas a las que no tienen referencias Para ver por qué, considere el escenario de un objeto que mantiene un contador de la frecuencia con la que se pinta un control en particular. En la creación, se suscribe al evento de "pintura" del control, y al eliminarlo se da de baja. El evento click simplemente incrementa un campo, y un método getTotalClicks()
devuelve el valor de ese campo.
Cuando se crea el objeto contador, debe hacer que una referencia a sí mismo se almacene dentro del control que está monitoreando. El control realmente no se preocupa por el objeto contador, y sería igual de feliz si el objeto contador y la referencia a él dejaran de existir, pero mientras exista la referencia, llamará al controlador de eventos de ese objeto cada vez. se pinta solo. Esta acción es totalmente inútil para el control, pero sería útil para cualquiera que llame getTotalClicks()
al objeto.
Si, por ejemplo, un método fuera para crear un nuevo objeto "contador de pintura", realizar alguna acción en el control, observar cuántas veces se repintó el control y luego abandonar el objeto contador de pintura, el objeto permanecería suscrito al evento incluso aunque a nadie le importaría si el objeto y todas las referencias a él simplemente desaparecieran. Sin embargo, los objetos no serían elegibles para la colección hasta que el control en sí lo sea. Si el método fuera invocado miles de veces dentro de la vida útil del control [un escenario plausible], podría causar un desbordamiento de memoria, pero por el hecho de que el costo de las invocaciones de N probablemente sería O (N ^ 2) u O (N ^ 3) a menos que el procesamiento de la suscripción fuera muy eficiente y la mayoría de las operaciones en realidad no involucraran ninguna pintura.
Este escenario particular podría manejarse si el control mantiene una referencia débil al objeto del contador en lugar de una fuerte. Un modelo de suscripción débil es útil, pero no funciona en el caso general. Supongamos que, en lugar de querer tener un objeto que supervise un solo tipo de evento desde un solo control, uno quisiera tener un objeto registrador de eventos que supervisara varios controles, y el mecanismo de manejo de eventos del sistema era tal que cada control necesitaba una referencia a un objeto de registrador de eventos diferente. En ese caso, el objeto que vincula un control al registrador de eventos debe permanecer vivo siempre que ambosel control que se monitorea y el registrador de eventos siguen siendo útiles. Si ni el control ni el registrador de eventos tienen una fuerte referencia al evento de vinculación, dejará de existir aunque todavía sea "útil". Si alguno de ellos tiene un evento fuerte, la vida útil del objeto de enlace puede extenderse inútilmente incluso si el otro muere.
Si no existe ninguna referencia a un objeto en ningún lugar del universo, el objeto puede considerarse inútil y eliminarse de la existencia. Sin embargo, el hecho de que exista una referencia a un objeto no implica que el objeto sea "útil". En muchos casos, la utilidad real de los objetos dependerá de la existencia de referencias a otros objetos que, desde la perspectiva de GC, no tienen ninguna relación con ellos.
Si los objetos son notificados determinísticamente cuando nadie está interesado en ellos, podrán usar esa información para asegurarse de que cualquier persona que se beneficie de ese conocimiento esté informado. Sin embargo, en ausencia de dicha notificación, no hay una forma general de determinar qué objetos se consideran "útiles" si se conoce solo el conjunto de referencias que existen, y no el significado semántico asociado a esas referencias. Por lo tanto, cualquier modelo que suponga que la existencia o no existencia de referencias es suficiente para la gestión automatizada de recursos estaría condenado incluso si el GC pudiera detectar instantáneamente el abandono de objetos.