Question d'entretien pour Développeur Python

Comment CPython gère-t-il la mémoire ?

Ce que le recruteur cherche à évaluer, comment structurer votre réponse et un exemple parlé à adapter.

Réponse rapide

CPython utilise le comptage de références comme mécanisme principal : chaque objet suit le nombre de références qui pointent sur lui, et il est libéré immédiatement quand ce compteur tombe à zéro. Un ramasse-miettes générationnel s'ajoute par-dessus pour attraper les cycles de références que le comptage seul ne peut pas libérer. La mémoire libérée par les petits objets retourne en général dans les pools internes de l'allocateur plutôt qu'au système d'exploitation.

Pourquoi les recruteurs posent cette question

Les questions de mémoire reviennent parce que les services Python fuient d'une manière qui n'est pas vraiment une fuite, et le recruteur veut savoir si vous savez raisonner dessus. Il vérifie que vous connaissez les deux mécanismes, pourquoi les cycles ont besoin d'un ramasse-miettes séparé, et pourquoi la mémoire résidente peut rester haute après un pic, ce qui est la fausse alerte la plus courante signalée sur les workers Python.

Comment structurer votre réponse

  • Commencez par le comptage de références et la libération déterministe.
  • Expliquez pourquoi les cycles ont besoin d'un ramasse-miettes séparé.
  • Décrivez brièvement la conception générationnelle.
  • Expliquez pourquoi la mémoire résidente ne redescend pas toujours.

Exemple de réponse

Exemple parlé, à la première personne

Le comptage de références fait le gros du travail. Chaque objet porte un compteur, lier un nom l'incrémente, lâcher un nom le décrémente, et à zéro l'objet est détruit sur-le-champ. Ce déterminisme explique qu'un fichier se ferme dès que la dernière référence disparaît dans CPython, même si je ne m'appuierais pas dessus dans du code censé tourner sur d'autres implémentations. Le comptage ne peut pas libérer les cycles, donc un parent qui tient un enfant qui retient le parent n'atteint jamais zéro. C'est ce dont s'occupe le ramasse-miettes générationnel, avec trois générations, les objets jeunes examinés le plus souvent et les survivants promus. Sur un worker de longue durée que j'ai débogué, la mémoire montait régulièrement et il s'est avéré que c'était un cache qui tenait des objets avec des références arrière, plus une traceback d'exception gardée dans une variable de module, ce qui épinglait des frames entières. Des instantanés tracemalloc pris à dix minutes d'intervalle ont pointé droit dessus. Il vaut la peine d'ajouter que libérer des objets ne rend souvent pas les pages au système d'exploitation, donc une RSS haute et plate après un pic est normale et non une fuite.

Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.

Voir comment ça marche

Questions de relance à prévoir

  • Comment confirmeriez-vous une fuite mémoire en production ?
  • Quand appelleriez-vous gc.collect vous-même ?
  • Que résolvent les références faibles ici ?

Autres questions pour Développeur Python

Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.

Prédire mes questions

Répétez les questions difficiles avant qu'on vous les pose

Entraînez-vous avec un copilote en direct, puis présentez-vous prêt. Un Session Pass à $29 vous accompagne pendant l'entretien, sans abonnement et sans engagement.

Obtenir GhostPilot