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:
- Contagem de referência
- 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:
Pythonimport 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:
Pythonimport 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.
Pythonimport 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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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.destroyPython
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:
Pythonimport 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:
Pythonimport 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:
Pythonimport 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 |