gc
— Interfaz del recolector de basura¶
Este módulo proporciona una interfaz para el recolector de basura opcional (recolector de basura cíclico generacional). Proporciona la capacidad de deshabilitar el recolector, ajustar la frecuencia de recolección y establecer opciones de depuración. También proporciona acceso a objetos inaccesibles (unreachables) que el recolector encontró pero no pudo liberar. Dado que el recolector de basura complementa el conteo de referencias, que ya se utiliza en Python, es posible desactivarlo siempre que se esté seguro de que el programa no crea referencias cíclicas. La recolección automática se puede desactivar llamando a gc.disable()
. Para depurar un programa con fugas de memoria, se debe llamar a gc.set_debug(gc.DEBUG_LEAK)
. Se debe tener en cuenta que la llamada anterior incluye gc.DEBUG_SAVEALL
, lo que hace que los objetos recolectados se guarden en gc.garbage para su inspección.
El módulo gc
proporciona las siguientes funciones:
- gc.enable()¶
Habilita la recolección automática de basura.
- gc.disable()¶
Deshabilita la recolección automática de basura.
- gc.isenabled()¶
Retorna
True
si la recolección automática está habilitada.
- gc.collect(generation=2)¶
Sin argumentos, ejecuta una recolección completa. El argumento opcional generation debe ser un número entero que especifica qué generación recolectar (de 0 a 2). Una excepción
ValueError
será lanzada si el número de generación no es válido. Se retorna el número de objetos inaccesibles encontrados.Las listas libres mantenidas para varios tipos incorporados son borradas cada vez que se ejecuta una recolección completa o una recolección de la generación más alta (2). No obstante, no todos los elementos de algunas listas libres pueden ser liberados, particularmente
float
, debido a su implementación particular.The effect of calling
gc.collect()
while the interpreter is already performing a collection is undefined.
- gc.set_debug(flags)¶
Establece las flags de depuración para la recolección de basura. La información de depuración se escribirá en
sys.stderr
. A continuación se puede consultar una lista con las flags de depuración disponibles, que se pueden combinar mediante operaciones de bits para controlar la depuración.
- gc.get_debug()¶
Retorna las flags de depuración actualmente establecidas.
- gc.get_objects(generation=None)¶
Retorna una lista de todos los objetos rastreados por el recolector, excluyendo la lista retornada. Si generation no es
None
, retorna solo los objetos rastreados por el recolector que pertenecen a esa generación.Distinto en la versión 3.8: Se agregó el parámetro generation.
Lanza un evento de auditoría
gc.get_objects
con el argumentogeneration
.
- gc.get_stats()¶
Retorna una lista de tres diccionarios, uno por cada generación, que contienen estadísticas de recolección desde el inicio del intérprete. El número de claves puede cambiar en el futuro, pero actualmente cada diccionario contendrá los siguientes elementos:
collections
es el número de veces que se recolectó esta generación;collected
es el número total de objetos recolectados dentro de esta generación;uncollectable
es el número total de objetos que se consideraron no recolectables (y por lo tanto, se movieron a la listagarbage
) dentro de esta generación.
Nuevo en la versión 3.4.
- gc.set_threshold(threshold0[, threshold1[, threshold2]])¶
Establece los umbrales de recolección (la frecuencia de recolección). Si se establece threshold0 en cero se deshabilita la recolección.
El recolector de basura (GC por sus siglas en inglés) clasifica los objetos en tres generaciones dependiendo de cuántos barridos de colección hayan sobrevivido. Los nuevos objetos se colocan en la generación más joven (generación
0
). Si un objeto sobrevive a una colección, se traslada a la siguiente generación anterior. Dado que la generación2
es la generación más antigua, los objetos de esa generación permanecen allí después de una colección. Para decidir cuándo ejecutar, el recopilador realiza un seguimiento del número de asignaciones y desasignaciones de objetos desde la última recopilación. Cuando el número de asignaciones menos el número de desasignaciones supera el treshold0, comienza la recopilación. Inicialmente solo se examina la generación0
. Si la generación0
se ha examinado más de treshold1 veces desde que se examinó la generación1
, también se examina la generación1
. Con la tercera generación, las cosas son un poco más complicadas, consulte Recopilación de la generación más antigua para obtener más información.
- gc.get_count()¶
Retorna los recuentos de la recolección actual como una tupla de la forma
(count0, count1, count2)
.
- gc.get_threshold()¶
Retorna los umbrales de la recolección actual como una tupla de la forma
(threshold0, threshold1, threshold2)
.
- gc.get_referrers(*objs)¶
Retorna la lista de objetos que referencian de forma directa a cualquiera de objs. Esta función solo localizará aquellos contenedores que admitan la recolección de basura; no se localizarán los tipos de extensión que referencian a otros objetos pero que no admiten la recolección de basura.
Téngase en cuenta que los objetos que ya se han desreferenciado, pero que tienen referencias cíclicas y aún no han sido recolectados por el recolector de basura pueden enumerarse entre las referencias resultantes. Para obtener solo los objetos activos actualmente, llame a
collect()
antes de llamar aget_referrers()
.Advertencia
Se debe tener un especial cuidado cuando se usan objetos retornados por
get_referrers()
dado que algunos de ellos aún podrían estar en construcción y por tanto en un estado temporalmente inválido. Debe evitarse el uso deget_referrers()
para cualquier propósito que no sea la depuración.Lanza un evento de auditoría
gc.get_referrers
con el argumentoobjs
.
- gc.get_referents(*objs)¶
Retorna una lista de objetos a los que hace referencia directamente cualquiera de los argumentos. Las referencias retornadas son aquellos objetos visitados por los métodos
tp_traverse
a nivel de C de los argumentos (si los hay) y es posible que no todos los objetos sean directamente accesibles realmente. Los métodostp_traverse
solo son compatibles con los objetos que admiten recolección de basura y solo se requieren para visitar objetos que pueden estar involucrados en un ciclo de referencias. Lo que quiere decir que, por ejemplo, si se puede acceder directamente a un número entero desde uno de los argumento, ese objeto entero puede aparecer o no en la lista de resultados.Lanza un evento de auditoría
gc.get_referents
con el argumentoobjs
.
- gc.is_tracked(obj)¶
Retorna
True
si el recolector de basura rastrea actualmente el objeto yFalse
en caso contrario. Como regla general, las instancias de tipos atómicos no se rastrean y las instancias de tipos no atómicos (contenedores, objetos definidos por el usuario …) sí. Sin embargo, algunas optimizaciones específicas de tipo pueden estar presentes para suprimir el impacto del recolector de basura en instancias simples (por ejemplo, diccionarios que contienen solo claves y valores atómicos):>>> gc.is_tracked(0) False >>> gc.is_tracked("a") False >>> gc.is_tracked([]) True >>> gc.is_tracked({}) False >>> gc.is_tracked({"a": 1}) False >>> gc.is_tracked({"a": []}) True
Nuevo en la versión 3.1.
- gc.is_finalized(obj)¶
Retorna
True
si el objeto dado ha sido finalizado por el recolector de basura,False
en caso contrario.>>> x = None >>> class Lazarus: ... def __del__(self): ... global x ... x = self ... >>> lazarus = Lazarus() >>> gc.is_finalized(lazarus) False >>> del lazarus >>> gc.is_finalized(x) True
Nuevo en la versión 3.9.
- gc.freeze()¶
Freeze all the objects tracked by the garbage collector; move them to a permanent generation and ignore them in all the future collections.
If a process will
fork()
withoutexec()
, avoiding unnecessary copy-on-write in child processes will maximize memory sharing and reduce overall memory usage. This requires both avoiding creation of freed «holes» in memory pages in the parent process and ensuring that GC collections in child processes won’t touch thegc_refs
counter of long-lived objects originating in the parent process. To accomplish both, callgc.disable()
early in the parent process,gc.freeze()
right beforefork()
, andgc.enable()
early in child processes.Nuevo en la versión 3.7.
- gc.unfreeze()¶
Descongela los objetos de la generación permanente y vuelve a colocarlos en la generación más antigua.
Nuevo en la versión 3.7.
- gc.get_freeze_count()¶
Retorna el número de objetos de la generación permanente.
Nuevo en la versión 3.7.
Las siguientes variables se proporcionan para acceso de solo lectura (se pueden mutar los valores pero no se deben vincular de nuevo):
- gc.garbage¶
Una lista de objetos que el recolector consideró inaccesibles pero que no pudieron ser liberados (objetos que no se pueden recolectar). A partir de Python 3.4, esta lista debe estar vacía la mayor parte del tiempo, excepto cuando se utilizan instancias de tipos de extensión C en los que la ranura (slot)
tp_del
no seaNULL
.Si se establece
DEBUG_SAVEALL
, todos los objetos inaccesibles se agregarán a esta lista en lugar de ser liberados.Distinto en la versión 3.2: Si la lista no está vacía en el momento del interpreter shutdown, se emite un
ResourceWarning
, que es silencioso de forma predeterminada. Si se estableceDEBUG_UNCOLLECTABLE
, además se imprimen todos los objetos no recolectables.Distinto en la versión 3.4: Following PEP 442, objects with a
__del__()
method don’t end up ingc.garbage
anymore.
- gc.callbacks¶
Una lista de retrollamadas que el recolector de basura invocará antes y después de la recolección. Las retrollamadas serán llamadas con dos argumentos, phase e info.
phase puede tomar uno de estos valores:
«start»: la recolección de basura está a punto de comenzar.
«stop»: la recolección de basura ha terminado.
info es un diccionario que proporciona información adicional para la retrollamada. Las siguientes claves están definidas actualmente:
«generation»: la generación más antigua que ha sido recolectada.
«collected»: cuando phase es «stop», el número de objetos recolectados satisfactoriamente.
«uncollectable»: cuando phase es «stop», el número de objetos que no pudieron ser recolectados y fueron ubicados en
garbage
.Las aplicaciones pueden agregar sus propias retrollamadas a esta lista. Los principales casos de uso son:
Recopilar estadísticas sobre la recolección de basura, como la frecuencia con la que se recolectan varias generaciones y cuánto tiempo lleva la recolección.
Permitir que las aplicaciones identifiquen y borren sus propios tipos no recolectables cuando aparecen en
garbage
.Nuevo en la versión 3.3.
Las siguientes constantes son proporcionadas para ser usadas con set_debug()
:
- gc.DEBUG_STATS¶
Imprime estadísticas durante la recolección. Esta información puede resultar útil para ajustar la frecuencia de recolección.
- gc.DEBUG_COLLECTABLE¶
Imprime información sobre los objetos recolectables encontrados.
- gc.DEBUG_UNCOLLECTABLE¶
Imprime información sobre los objetos no recolectables encontrados (objetos inaccesibles, pero que el recolector no puede liberar). Estos objetos se agregarán a la lista
garbage
.Distinto en la versión 3.2: También imprime el contenido de la lista
garbage
durante interpreter shutdown, si no está vacía.
- gc.DEBUG_SAVEALL¶
Cuando se establece, todos los objetos inaccesibles encontrados se agregarán a garbage en lugar de ser liberados. Esto puede resultar útil para depurar un programa con fugas de memoria.
- gc.DEBUG_LEAK¶
Las flags de depuración necesarias para que el recolector imprima información sobre un programa con fugas de memoria (igual a
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL
).