logo

Coleta de lixo em Python

Coleta de lixo em Pitão é um processo automático que lida com a alocação e desalocação de memória, garantindo o uso eficiente da memória. Ao contrário de linguagens como C ou C++ onde o programador deve alocar e desalocar memória manualmente. Python gerencia automaticamente a memória por meio de duas estratégias principais:

  1. Contagem de referência
  2. Coleta de lixo

Contagem de referência

Python usa contagem de referência para gerenciar a memória. Cada objeto controla quantas referências apontam para ele. Quando a contagem de referências cai para zero, ou seja, nenhuma referência permanece, o Python desaloca automaticamente o objeto. Exemplo:

Python
import sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x)) 

Saída
2 3 2 

Explicação:



  • x é referenciado duas vezes inicialmente (uma vez por x, uma vez por getrefcount()).
  • Atribuindo y = x aumenta a contagem.
  • Contexto y = Nenhum remove uma referência.

Problema com contagem de referência

A contagem de referências falha na presença de referências cíclicas, ou seja, objetos que fazem referência entre si em um ciclo. Mesmo que nada mais aponte para eles, sua contagem de referências nunca chega a zero. Exemplo:

Python
import sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y)) 

Saída
3 3 

Explicação:

  • x contém e e e contém x .
  • Mesmo depois de excluir x e e Python não será capaz de liberar memória apenas usando a contagem de referências porque cada uma ainda faz referência à outra.

Coleta de lixo para referências cíclicas

Coleta de lixo é uma técnica de gerenciamento de memória usada em linguagens de programação para recuperar automaticamente a memória que não está mais acessível ou em uso pelo aplicativo. Para lidar com essas referências circulares, o Python usa um Coletor de lixo (GC) do módulo gc integrado. Este coletor é capaz de detectar e limpar objetos envolvidos em ciclos de referência.

Coleta de lixo geracional

O coletor de lixo geracional do Python foi projetado para lidar com referências cíclicas. Ele organiza os objetos em três gerações com base na sua vida útil:

  • Geração 0: Objetos recém-criados.
  • Geração 1: Objetos que sobreviveram a um ciclo de coleta.
  • Geração 2: Objetos de vida longa.

Quando ocorrem ciclos de referência, o coletor de lixo os detecta e limpa automaticamente, liberando memória.

Coleta Automática de Lixo de Ciclos

A coleta de lixo é executada automaticamente quando o número de alocações excede o número de desalocações em um determinado limite. Este limite pode ser inspecionado usando o módulo gc.

Python
import gc print(gc.get_threshold()) 

Saída
(2000 10 10) 

Explicação: Ele retorna a tupla de limite para as gerações 0, 1 e 2. Quando as alocações excedem o limite, a coleta é acionada.

Coleta manual de lixo

Às vezes é benéfico invocar manualmente o coletor de lixo, especialmente no caso de ciclos de referência. Exemplo:

Python
import gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c) 

Saída
0 10 

Explicação:

  • definitivamente divertido (eu) cria uma referência cíclica fazendo uma referência de dicionário.
  • gc.collect() aciona a coleta de lixo e armazena a contagem de objetos coletados (inicialmente 0).
  • para i no intervalo (10) chamadas divertido (eu) 10 vezes criando 10 referências cíclicas.
  • gc.collect() aciona novamente a coleta de lixo e imprime a contagem de ciclos coletados.

Tipos de coleta manual de lixo

  • Coleta de lixo baseada no tempo: O coletor de lixo é acionado em intervalos de tempo fixos.
  • Coleta de lixo baseada em eventos: O coletor de lixo é chamado em resposta a eventos específicos, como quando um usuário sai do aplicativo ou quando o aplicativo fica ocioso.

Coletas forçadas de lixo

O coletor de lixo (GC) do Python é executado automaticamente para limpar objetos não utilizados. Para forçá-lo manualmente, use gc.collect() do módulo gc. Exemplo:

Python
import gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect() 

Explicação:

  • do a b c exclui referências a um b e c tornando-os elegíveis para coleta de lixo.
  • gc.collect() força a coleta de lixo para liberar memória, limpando objetos não referenciados.

Desativando a coleta de lixo

Em Python, o coletor de lixo é executado automaticamente para limpar objetos não referenciados. Para evitar que ele seja executado, você pode desativá-lo usando gc.disable() do módulo gc. Exemplo:

Python
import gc gc.disable() gc.enable() 

Explicação:

  • gc.disable() desativa a coleta automática de lixo.
  • gc.enable() reativa a coleta automática de lixo.

Interagindo com o coletor de lixo python

Um mecanismo integrado chamado coletor de lixo Python elimina automaticamente objetos que não são mais referenciados para liberar memória e impedir vazamentos de memória. O módulo gc do Python oferece várias maneiras de interagir com o coletor de lixo, que geralmente é executado automaticamente.

1. Habilitando e desabilitando o coletor de lixo: Você pode ativar ou desativar o coletor de lixo usando o gc. habilitar() e gc. desabilitar() funções respectivamente. Exemplo :

thread.destroy
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Forçando a coleta de lixo: Você pode acionar manualmente uma coleta de lixo usando o comando gc. coletar() função. Isso pode ser útil nos casos em que você deseja forçar a coleta de lixo imediata em vez de aguardar a ocorrência da coleta de lixo automática.  Exemplo:

Python
import gc gc.collect() 

3. Inspecionando as configurações do coletor de lixo: Você pode inspecionar as configurações atuais do coletor de lixo usando o comando gc.get_threshold() função que retorna uma tupla representando os limites atuais para as gerações 0 1 e 2.  Exemplo:

Python
import gc t = gc.get_threshold() print(t) 

Saída
(2000 10 10) 

4. Configurando limites do coletor de lixo: Você pode definir os limites para coleta de lixo usando o comando gc.set_threshold() função. Isso permite ajustar manualmente os limites para diferentes gerações, o que pode afetar a frequência da coleta de lixo.  Exemplo:

Python
import gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t) 

Saída
(500 5 5) 

Vantagens e Desvantagens 

Vamos explorar alguns dos benefícios e desvantagens da coleta de lixo do Python.

Vantagens

Desvantagens

Gerenciamento Automático de Memória

Pode introduzir sobrecarga de desempenho

Sem manipulação manual de memória

Requer compreensão dos conceitos de memória

Limpeza Eficiente através de Gerações

Controle limitado sobre o tempo do GC

Configurações personalizáveis ​​do GC

Possibilidade de bugs ou vazamentos de memória

Criar questionário