Pergunta de entrevista para Desenvolvedor Python

Como o CPython gerencia memória?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

O CPython usa contagem de referências como mecanismo principal: todo objeto rastreia quantas referências apontam para ele, e é liberado imediatamente quando essa contagem chega a zero. Um coletor geracional de ciclos roda por cima para pegar ciclos de referência que a contagem sozinha não consegue liberar. A memória liberada por objetos pequenos normalmente volta para pools internos do alocador, não para o sistema operacional.

Por que os entrevistadores perguntam isso

Perguntas de memória aparecem porque serviços Python vazam de jeitos que não são bem vazamentos, e o entrevistador quer saber se você consegue raciocinar sobre isso. Eles estão checando se você sabe que os dois mecanismos existem, por que ciclos precisam de um coletor separado, e por que a memória residente pode continuar alta depois de um pico, que é o alarme falso mais comum reportado contra workers Python.

Como estruturar sua resposta

  • Comece pela contagem de referências e a liberação determinística.
  • Explique por que ciclos precisam de um coletor separado.
  • Descreva o design geracional brevemente.
  • Explique por que a memória residente nem sempre cai.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A contagem de referências faz a maior parte do trabalho. Todo objeto carrega uma contagem, ligar um nome incrementa, soltar um nome decrementa, e em zero o objeto é destruído na hora. Esse determinismo é o motivo de um arquivo fechar assim que a última referência some no CPython, embora eu não confiaria nisso em código feito para rodar em outras implementações. A contagem não consegue liberar ciclos, então um pai segurando um filho que segura o pai de volta nunca chega a zero. É isso que o coletor geracional trata, com três gerações, objetos jovens checados com mais frequência e sobreviventes promovidos. Num worker de vida longa que eu depurei, a memória subia constantemente e no fim era um cache segurando objetos com referências de volta mais um traceback de exceção guardado numa variável de módulo, que prendia frames inteiros. Snapshots do tracemalloc tirados com dez minutos de diferença apontaram direto para aquilo. Vale acrescentar que liberar objetos muitas vezes não devolve páginas para o sistema operacional, então um RSS alto e estável depois de um pico é normal e não um vazamento.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • Como você confirmaria um vazamento de memória em produção?
  • Quando você chamaria gc.collect por conta própria?
  • O que referências fracas resolvem aqui?

Mais perguntas para Desenvolvedor Python

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot