2012-01-30 24 views
18

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

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

¿Alguna idea?

Muchas gracias.

Respuesta

16

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 usan un sistema puramente basura.

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

14

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

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

1

Mi conjetura inicial es que el uso del recuento de referencias puede eliminar fácilmente objetos de referencia no cíclicos, esto de alguna manera puede acelerar la marca y barrido y ganar memoria inmediatamente. No sé si mi suposición es correcta?

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

Cuestiones relacionadas