CPython nutzt Reference Counting als primären Mechanismus: jedes Objekt zählt mit, wie viele Referenzen auf es zeigen, und wird sofort freigegeben, wenn der Zähler null erreicht. Darüber läuft ein generationeller Cycle Collector, der Referenzzyklen einsammelt, die Zählen allein nicht freigeben kann. Speicher, den kleine Objekte freigeben, geht meist zurück in interne Allocator-Pools statt ans Betriebssystem.
Warum Interviewer das fragen
Speicherfragen kommen, weil Python-Services auf eine Art lecken, die eigentlich kein Leck ist, und der Interviewer will wissen, ob du darüber sauber nachdenken kannst. Geprüft wird, ob du beide Mechanismen kennst, warum Zyklen einen eigenen Collector brauchen und warum Resident Memory nach einer Spitze hoch bleiben kann, was der mit Abstand häufigste Fehlalarm bei Python-Workern ist.
So baust du deine Antwort auf
- Fang mit Reference Counting und deterministischem Freigeben an.
- Erklär, warum Zyklen einen eigenen Collector brauchen.
- Beschreib das generationelle Design kurz.
- Erklär, warum Resident Memory nicht immer sinkt.
Beispielantwort
Reference Counting erledigt den Großteil. Jedes Objekt trägt einen Zähler, das Binden eines Namens erhöht ihn, das Loslassen senkt ihn, und bei null wird das Objekt sofort zerstört. Diese Determiniertheit ist der Grund, warum eine Datei in CPython schließt, sobald die letzte Referenz verschwindet, auch wenn ich mich in Code, der unter anderen Implementierungen laufen soll, nicht darauf verlassen würde. Zählen kann Zyklen nicht freigeben, also erreicht ein Parent, der ein Child hält, das den Parent zurückhält, nie null. Genau das übernimmt der generationelle Collector, mit drei Generationen, junge Objekte werden am häufigsten geprüft und Überlebende befördert. In einem lang laufenden Worker, den ich debuggt habe, stieg der Speicher stetig, und es stellte sich heraus, dass ein Cache Objekte mit Rückreferenzen hielt, plus ein Exception-Traceback in einer Modulvariable, was ganze Frames festgenagelt hat. Tracemalloc-Snapshots im Abstand von zehn Minuten haben direkt darauf gezeigt. Erwähnenswert ist noch, dass das Freigeben von Objekten oft keine Pages ans Betriebssystem zurückgibt, ein flach hoher RSS nach einer Spitze also normal ist und kein Leck.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Wie würdest du ein Speicherleck in Produktion bestätigen?
- Wann würdest du gc.collect selbst aufrufen?
- Was lösen Weak References hier?
Weitere Fragen für Python-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen