Resurrección de objetos


En los lenguajes de programación orientados a objetos con recolección de basura , la resurrección de un objeto es cuando un objeto vuelve a la vida durante el proceso de destrucción del objeto , como efecto secundario de la ejecución de un finalizador .

La resurrección de objetos causa una serie de problemas , en particular porque la posibilidad de la resurrección de objetos, incluso si no ocurre, hace que la recolección de basura sea significativamente más complicada y lenta, y es una de las principales razones por las que se desaconseja a los finalizadores. Los lenguajes tratan la resurrección de objetos de diversas formas, como soluciones a estos problemas. En raras circunstancias, la resurrección de objetos se usa para implementar ciertos patrones de diseño, en particular un grupo de objetos , [1] mientras que en otras circunstancias la resurrección es un error no deseado causado por un error en los finalizadores y, en general, se desaconseja la resurrección. [2]

La resurrección de objetos se produce mediante el siguiente proceso. Primero, un objeto se convierte en basura cuando ya no es accesible desde el programa y puede ser recolectado (destruido y desasignado). Luego, durante la destrucción del objeto, antes de que el recolector de basura desasigne el objeto, se puede ejecutar un método de finalizador , que a su vez puede hacer que ese objeto u otro objeto de basura (accesible desde el objeto con un finalizador) sea accesible nuevamente creando referencias a él, como un finalizador puede contener código arbitrario. Si esto sucede, el objeto referenciado, que no es necesariamente el objeto finalizado, ya no es basura y no se puede desasignar, ya que de lo contrario las referencias a él se convertirían en referencias colgantes.y provocan errores cuando se utilizan, generalmente el programa se bloquea o el comportamiento es impredecible. En cambio, para mantener la seguridad de la memoria , el objeto vuelve a la vida o resucita.

Para detectar esto, un recolector de basura generalmente hará una recolección en dos fases en presencia de finalizadores: primero finalizará cualquier basura que tenga un finalizador y luego volver a verificar toda la basura (o toda la basura accesible desde los objetos con finalizadores), en caso de que los finalizadores hayan resucitado algo de basura. Esto agrega sobrecarga y retrasa la recuperación de memoria.

Un objeto resucitado puede ser tratado de la misma manera que otros objetos, o puede ser tratado de manera especial. En muchos lenguajes, especialmente C #, Java y Python (de Python 3.4), los objetos solo se finalizan una vez, para evitar la posibilidad de que un objeto resucite repetidamente o incluso sea indestructible; en C #, los objetos con finalizadores de forma predeterminada solo se finalizan una vez, pero se pueden volver a registrar para su finalización. En otros casos, los objetos resucitados se consideran errores, especialmente en Objective-C; o tratado de manera idéntica a otros objetos, especialmente en Python antes de Python 3.4.

Un objeto resucitado a veces se llama objeto zombi ozombi, pero este término se usa para varios estados de objetos relacionados con la destrucción de objetos, y el uso depende del idioma y el autor. Sin embargo,un "objeto zombi" tiene un significado especializado enObjective-C, que se detalla a continuación. Los objetos zombies son algo análogos a losprocesos zombies, ya que han sufrido un cambio de estado de terminación y están cerca de la desasignación, pero los detalles son significativamente diferentes.