En pocas palabras : los recolectores de basura no utilizan la recursividad. Simplemente controlan el seguimiento al realizar un seguimiento de esencialmente dos conjuntos (que pueden combinarse). El orden de rastreo y procesamiento de celdas es irrelevante, lo que brinda una considerable libertad de implementación para representar los conjuntos. Por lo tanto, hay muchas soluciones que en realidad son muy baratas en el uso de la memoria. Esto es esencial ya que el GC se llama precisamente cuando el montón se queda sin memoria. Las cosas son un poco diferentes con grandes memorias virtuales, como las nuevas páginas se pueden asignar fácilmente, y el ennemy no es la falta de espacio, pero la falta de datos de
localización .
Supongo que está considerando rastrear recolectores de basura, no un recuento de referencias para el cual su pregunta no parece aplicarse.
La pregunta se centra en el costo de memoria del rastreo para realizar un seguimiento de un conjunto: el conjunto (para no rastreado) de celdas de memoria accesibles que aún contienen punteros que aún no se han rastreado. Esto es solo la mitad del problema de memoria
para la recolección de basura. El GC también debe realizar un seguimiento de otro conjunto: el conjunto V (para visitado) de todas las celdas que se ha encontrado que son accesibles, para reclamar todas las otras celdas al final del proceso. Discutir uno y no el otro tiene un sentido limitado, ya que pueden tener un costo similar, usar soluciones similares e incluso combinarse.UV
Lo primero a tener en cuenta es que todos los GC de seguimiento siguen el mismo modelo abstracto, basado en la exploración sistemática del gráfico dirigido de celdas en la memoria accesible desde el programa, donde las celdas de memoria son vértices y los punteros son los bordes dirigidos. Utiliza para eso los siguientes conjuntos:
VVV= U∪ T
U
T
H
VUUT
UV
UdoVUdoUT
UUV= TVH- VV
VUUT
También omito detalles sobre qué es una celda, si vienen en un tamaño o muchos, cómo encontramos punteros en ellos, cómo se pueden compactar y una serie de otros problemas técnicos que puede encontrar en libros y encuestas sobre recolección de basura. .
U
Donde las implementaciones conocidas difieren es en la forma en que estos conjuntos están realmente representados. Muchas técnicas se han utilizado realmente:
mapa de bits: se conserva algo de espacio de memoria para un mapa que tiene un bit para cada celda de memoria, que se puede encontrar utilizando la dirección de la celda. El bit está activado cuando la celda correspondiente está en el conjunto definido por el mapa. Si solo se utilizan mapas de bits, solo necesita 2 bits por celda.
alternativamente, puede tener espacio para un bit de etiqueta especial (o 2) en cada celda para marcarlo.
Iniciar sesión2pagspags
Puede probar un predicado sobre el contenido de la celda y sus punteros.
puede reubicar la celda en una parte libre de la memoria destinada a todas las celdas pertenecientes al conjunto representado.
VTTU
En realidad, puede combinar estas técnicas, incluso para un solo conjunto.
Como se dijo, todo lo anterior ha sido utilizado por un recolector de basura implementado, por extraño que parezca. Todo depende de las diversas limitaciones de la implementación. Y pueden ser bastante baratos en el uso de la memoria, posiblemente ayudados por el procesamiento de políticas de pedidos que se pueden elegir libremente para ese propósito, ya que no importan para el resultado final.
Lo que puede parecer el más extraño, la transferencia de celdas en una nueva área, en realidad es muy común: se llama colección de copias. Se utiliza principalmente con memoria virtual.
Claramente no hay recursión, y la pila del algoritmo mutador no tiene que ser utilizada.
Otro punto importante es que muchos GC modernos se implementan para grandes memorias virtuales . Entonces, obtener espacio para implementar y una lista o pila adicional no es un problema, ya que las páginas nuevas se pueden asignar fácilmente. Sin embargo, en grandes recuerdos virtuales, el enemigo no es la falta de espacio sino la falta de localidad . Luego, la estructura que representa los conjuntos, y su uso, debe orientarse a preservar la localidad de la estructura de datos y de la ejecución del GC. El problema no es el espacio sino el tiempo. Las implementaciones inadecuadas tienen más probabilidades de mostrar una desaceleración inaceptable que el desbordamiento de memoria.
No di referencias a los muchos algoritmos específicos, como resultado de varias combinaciones de estas técnicas, ya que esto parece lo suficientemente largo.