CPython का मुख्य तरीका reference counting है: हर ऑब्जेक्ट गिनता है कि कितने references उस पर हैं, और गिनती शून्य होते ही वह तुरंत मुक्त हो जाता है। उसके ऊपर एक generational cycle collector चलता है जो उन reference cycles को पकड़ता है जिन्हें अकेली गिनती मुक्त नहीं कर सकती। छोटे ऑब्जेक्ट से खाली हुई मेमोरी आम तौर पर ऑपरेटिंग सिस्टम को नहीं, अंदरूनी allocator pools को वापस जाती है।
इंटरव्यूअर यह क्यों पूछते हैं
मेमोरी के सवाल इसलिए आते हैं कि Python सर्विसेज ऐसे तरीकों से leak करती हैं जो असल में leak नहीं होते, और इंटरव्यूअर देखना चाहता है कि आप इस पर तर्क कर सकते हैं। वे जांच रहे हैं कि आप दोनों तरीके जानते हैं, cycles के लिए अलग collector क्यों चाहिए, और spike के बाद resident memory ऊंची क्यों रह सकती है, जो Python वर्कर्स के खिलाफ सबसे आम झूठा अलार्म है।
अपना जवाब कैसे स्ट्रक्चर करें
- reference counting और तय समय पर मुक्त होने से शुरू करें।
- समझाएं कि cycles के लिए अलग collector क्यों चाहिए।
- generational डिजाइन संक्षेप में बताएं।
- बताएं कि resident memory हमेशा क्यों नहीं गिरती।
उदाहरण जवाब
ज्यादातर काम reference counting करती है। हर ऑब्जेक्ट एक गिनती रखता है, नाम बांधने पर वह बढ़ती है, नाम छोड़ने पर घटती है, और शून्य पर ऑब्जेक्ट वहीं नष्ट हो जाता है। इसी निश्चितता की वजह से CPython में आखिरी reference हटते ही file बंद हो जाती है, हालांकि दूसरे implementations पर चलने वाले कोड में मैं इस पर भरोसा नहीं करूंगा। गिनती cycles को मुक्त नहीं कर सकती, तो parent जो child को पकड़े है और child जो parent को, वह कभी शून्य तक नहीं पहुंचता। यही generational collector संभालता है, तीन generations के साथ, जहां नए ऑब्जेक्ट सबसे ज्यादा बार जांचे जाते हैं और बचे हुए ऊपर चढ़ा दिए जाते हैं। एक लंबे चलने वाले वर्कर में मैंने डीबग किया जहां मेमोरी लगातार चढ़ रही थी, और वजह निकली back references वाले ऑब्जेक्ट रखने वाला एक cache, साथ में module level variable में रखा गया exception traceback, जो पूरे frames को पकड़े हुए था। दस दस मिनट पर लिए गए tracemalloc snapshots ने सीधे उसी पर उंगली रख दी। यह भी जोड़ने लायक है कि ऑब्जेक्ट मुक्त होने पर अक्सर pages ऑपरेटिंग सिस्टम को वापस नहीं जातीं, इसलिए spike के बाद RSS का ऊंचा और सपाट रहना सामान्य है, leak नहीं।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- प्रोडक्शन में memory leak की पुष्टि आप कैसे करेंगे?
- आप खुद gc.collect कब कॉल करेंगे?
- यहां weak references किस समस्या को हल करते हैं?
Python डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें