Rastreo de recolección de basura


En la programación informática , el seguimiento de la recolección de elementos no utilizados es una forma de gestión automática de la memoria que consiste en determinar qué objetos se deben desasignar ("recolectar elementos no utilizados") rastreando qué objetos son accesibles mediante una cadena de referencias desde ciertos objetos "raíz" y considerando la descansar como "basura" y recogerlos. El seguimiento de la recolección de elementos no utilizados es el tipo más común de recolección de elementos no utilizados , tanto que "recolección de elementos no utilizados" a menudo se refiere al seguimiento de la recolección de elementos no utilizados, en lugar de otros métodos como el recuento de referencias , y hay una gran cantidad de algoritmos utilizados en la implementación.

De manera informal, un objeto es accesible si al menos una variable del programa hace referencia a él, ya sea directamente o mediante referencias de otros objetos accesibles. Más precisamente, los objetos solo pueden ser accesibles de dos maneras:

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 establece una distinción entre basura sintáctica , aquellos objetos que el programa no puede alcanzar, y basura semántica , aquellos 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 debe poder distinguir de alguna manera qué variables en la pila o campos en un objeto son valores regulares y cuáles son referencias: en 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 tienen referencias que los apunten directa o indirectamente desde el conjunto raíz. Sin embargo, algunos programas requieren referencias débiles , que deberían poder usarse mientras exista el objeto, pero no deberían prolongar su vida útil. En 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 sólidas (es decir, ordinarias) a él, aunque todavía puede haber algunas referencias débiles a él.


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