Seguimiento de la recolección de basura


En programación de computadoras , rastrear la recolección de basura es una forma de administración automática de memoria que consiste en determinar qué objetos deben ser desasignados ("recolección de basura") rastreando qué objetos son accesibles por una cadena de referencias de ciertos objetos "raíz", y considerando el descansar como "basura" y recogerlos. El seguimiento de la recolección de basura es el tipo más común de recolección de basura , tanto que "recolección de basura" a menudo se refiere al seguimiento de la recolección de basura, en lugar de otros métodos como el recuento de referencias , y hay una gran cantidad de algoritmos usados ​​en la implementación.

De manera informal, un objeto es accesible si es referenciado por al menos una variable en el programa, ya sea directamente o mediante referencias de otros objetos accesibles. Más precisamente, se puede acceder a los objetos solo de dos formas:

La definición de accesibilidad de "basura" no es óptima, en la medida en que la última vez que un programa usa un objeto podría ser mucho antes de que ese objeto caiga fuera del alcance del entorno. A veces se hace una distinción entre basura sintáctica , aquellos objetos que el programa posiblemente no puede alcanzar, y basura semántica , esos objetos que el programa nunca volverá a usar. Por ejemplo:

Se puede demostrar fácilmente que el problema de identificar con precisión la basura semántica es parcialmente decidible : un programa que asigna un objeto X , ejecuta un programa de entrada arbitrario P y usa X si y solo si P termina requeriría un recolector de basura semántica para resolver la detención. problema . Aunque los métodos heurísticos conservadores para la detección de basura semántica siguen siendo un área de investigación activa, esencialmente todos los recolectores de basura prácticos se centran en la basura sintáctica. [ cita requerida ]

Otra complicación con este enfoque es que, en lenguajes con tipos de referencia y tipos de valor sin caja , el recolector de basura necesita de alguna manera poder distinguir qué variables en la pila o campos en un objeto son valores regulares y cuáles son referencias: en la memoria, un número entero y una referencia pueden parecerse. El recolector de basura necesita saber si tratar el elemento como una referencia y seguirlo, o si es un valor primitivo. Una solución común es el uso de punteros etiquetados .

El recolector de basura solo puede reclamar objetos que no tengan referencias que los apunten directa o indirectamente desde el conjunto raíz. Sin embargo, algunos programas requieren referencias débiles , que deberían ser utilizables mientras exista el objeto, pero no deberían prolongar su vida útil. En las discusiones sobre referencias débiles, las referencias ordinarias a veces se denominan referencias fuertes . Un objeto es elegible para la recolección de basura si no hay referencias fuertes (es decir, ordinarias) a él, aunque todavía pueda haber algunas referencias débiles.


Marcar y barrer ingenuo en acción en un montón que contiene ocho objetos . Las flechas representan referencias a objetos . Los círculos representan los objetos en sí mismos. Los objetos n. ° 1, n. ° 2, n. ° 3, n. ° 4 y n. ° 6 están fuertemente referenciados desde el conjunto raíz. Por otro lado, los objetos n. ° 5, n. ° 7 y n. ° 8 no están fuertemente referenciados ni directa ni indirectamente desde el conjunto raíz; por lo tanto, son basura.
Un ejemplo de marca tricolor en un montón con 8 objetos. Los objetos blancos, grises y negros están representados por gris claro, amarillo y azul, respectivamente.