python garbage-collection

¿Por qué Python utiliza el recuento de referencias y el marcado y barrido para gc?



garbage-collection (3)

Mi conjetura inicial es que usar el recuento de referencias puede eliminar fácilmente los objetos de referencia no cíclicos, esto puede acelerar un poco el marcado y barrido y ganar memoria de inmediato. No sé si mi suposición es correcta?

Sí. Tan pronto como el número de referencia llegue a cero y se pueda eliminar el objeto. Esto no sucederá en un objeto de referencia cíclica. AFAIK, marcar y barrer es una operación costosa y la forma más sencilla de implementarlo requiere que "detenga el mundo" mientras los objetos están marcados. Cuando todos los objetos se recorren, se libera un objeto no marcado (como alcanzable).

Mi pregunta es ¿por qué Python utiliza el recuento de referencias y el marcado y barrido para gc? ¿Por qué no solo marcar y barrer?

Mi conjetura inicial es que usar el recuento de referencias puede eliminar fácilmente los objetos de referencia no cíclicos, esto puede acelerar un poco el marcado y barrido y ganar memoria de inmediato. No sé si mi suposición es correcta?

¿Alguna idea?

Muchas gracias.


Python (el idioma) no dice qué tipo de recolección de basura utiliza. La implementación principal (a menudo conocida como CPython) actúa como usted describe. Otras versiones, como Jython o IronPython, utilizan un sistema de recolección de basura.

Sí, hay un beneficio de la recopilación anterior con conteo de referencias, pero la razón principal por la que CPython lo usa es histórica. Originalmente no había recolección de basura para objetos cíclicos, por lo que los ciclos conducían a fugas de memoria. Las API de C y las estructuras de datos se basan en gran medida en el principio de conteo de referencias. Cuando se agregó la recolección de basura real, no era una opción romper las API binarias existentes y todas las bibliotecas que dependían de ellas, por lo que el recuento de referencias debía permanecer.


El recuento de referencias desasigna los objetos antes que la recolección de basura.

Pero como el conteo de referencias no puede manejar ciclos de referencia entre objetos inalcanzables, Python usa un recolector de basura (en realidad solo un recolector de ciclos) para recolectar esos ciclos cuando existen.