इस प्रश्न का संक्षिप्त उत्तर यह है कि इनमें से कोई भी मान इस बात का विश्वसनीय संकेतक नहीं है कि एक निष्पादन योग्य मेमोरी वास्तव में कितना उपयोग कर रही है, और उनमें से कोई भी स्मृति रिसाव को डीबग करने के लिए वास्तव में उपयुक्त नहीं है।
निजी बाइट्स उस मेमोरी की मात्रा को संदर्भित करते हैं जो प्रक्रिया निष्पादन योग्य ने मांगी है - जरूरी नहीं कि वह राशि जो वास्तव में उपयोग कर रही है । वे "निजी" हैं क्योंकि वे (आमतौर पर) मेमोरी-मैप्ड फ़ाइलों (यानी साझा DLL) को बाहर करते हैं। लेकिन - यहाँ पकड़ है - वे जरूरी नहीं कि उन फ़ाइलों द्वारा आवंटित स्मृति को बाहर करें । यह बताने का कोई तरीका नहीं है कि क्या निजी बाइट्स में एक परिवर्तन निष्पादन योग्य होने के कारण, या एक लिंक किए गए पुस्तकालय के कारण था। निजी बाइट्स भी कर रहे हैं नहीं विशेष रूप से भौतिक स्मृति; उन्हें डिस्क पर या स्टैंडबाय पेज सूची में रखा जा सकता है (अर्थात अब उपयोग में नहीं है, लेकिन अभी तक पृष्ठांकित नहीं है)।
वर्किंग सेट प्रक्रिया द्वारा उपयोग की जाने वाली कुल भौतिक मेमोरी (RAM) को संदर्भित करता है । हालांकि, निजी बाइट्स के विपरीत, इसमें मेमोरी-मैप्ड फाइलें और विभिन्न अन्य संसाधन भी शामिल हैं, इसलिए यह निजी बाइट्स की तुलना में कम सटीक माप है। यह वही मूल्य है जो टास्क मैनेजर के "मेम उपयोग" में रिपोर्ट किया गया है और हाल के वर्षों में भ्रम की अंतहीन मात्रा का स्रोत रहा है। वर्किंग सेट में मेमोरी इस अर्थ में "भौतिक" है कि इसे पृष्ठ दोष के बिना संबोधित किया जा सकता है; हालाँकि, स्टैंडबाय पेज लिस्ट अभी भी मेमोरी में फिजिकली है लेकिन वर्किंग सेट में रिपोर्ट नहीं की गई है, और यही कारण है कि जब आप किसी एप्लिकेशन को मिनिमाइज करते हैं तो आपको "मेम यूसेज" अचानक गिर सकता है।
वर्चुअल बाइट्स पूरी प्रक्रिया द्वारा कब्जे में लिया गया कुल वर्चुअल एड्रेस स्पेस है। यह काम करने वाले सेट की तरह है, इस अर्थ में कि इसमें मेमोरी-मैप्ड फ़ाइलें (साझा DLLs) शामिल हैं, लेकिन इसमें स्टैंडबाय सूची में डेटा भी शामिल है और डेटा जो पहले ही पृष्ठांकित हो चुका है और कहीं न कहीं डिस्क पर पेजफाइल में बैठा है। भारी लोड के तहत एक प्रणाली पर हर प्रक्रिया द्वारा उपयोग किए जाने वाले कुल आभासी बाइट्स वास्तव में मशीन की तुलना में काफी अधिक मेमोरी तक जोड़ देंगे।
तो रिश्ते हैं:
- निजी बाइट्स हैं जो आपके ऐप को वास्तव में आवंटित किए गए हैं, लेकिन पेजफाइल का उपयोग शामिल है;
- वर्किंग सेट गैर-पृष्ठांकित निजी बाइट्स प्लस मेमोरी-मैप्ड फ़ाइलें है;
- वर्चुअल बाइट्स वर्किंग सेट प्लस पेजेड प्राइवेट बाइट्स और स्टैंडबाय लिस्ट हैं।
यहाँ एक और समस्या है; जिस तरह साझा लाइब्रेरी आपके एप्लिकेशन मॉड्यूल के अंदर मेमोरी को आवंटित कर सकती है, जिससे आपके ऐप के प्राइवेट बाइट्स में रिपोर्ट की जाने वाली संभावित गलत सकारात्मकता हो सकती है , आपका एप्लिकेशन भी साझा किए गए मॉड्यूल के अंदर मेमोरी को आवंटित करने से समाप्त हो सकता है , जिससे झूठी नकारात्मकता हो सकती है। । इसका मतलब है कि आपके आवेदन के लिए मेमोरी लीक होना वास्तव में संभव है जो कभी भी निजी बाइट्स में खुद को प्रकट नहीं करता है। अकारण, लेकिन संभव है।
निजी बाइट्स आपके निष्पादन योग्य मेमोरी की मात्रा का एक उचित अनुमान है और इसका उपयोग मेमोरी लीक के लिए संभावित उम्मीदवारों की सूची को कम करने में मदद करने के लिए किया जा सकता है ; यदि आप संख्या को लगातार और अंतहीन रूप से बढ़ते और बढ़ते हुए देखते हैं, तो आप एक लीक के लिए उस प्रक्रिया की जांच करना चाहेंगे। हालाँकि, यह साबित नहीं किया जा सकता है कि कोई रिसाव है या नहीं है।
विंडोज में मेमोरी लीक का पता लगाने / सही करने के लिए सबसे प्रभावी उपकरण वास्तव में विजुअल स्टूडियो है (लिंक मेमोरी पेज के लिए वीएस का उपयोग करने पर पृष्ठ पर जाता है, उत्पाद पृष्ठ पर नहीं)। तर्कसंगत शुद्धिकरण एक और संभावना है। Microsoft के पास इस विषय पर एक अधिक सामान्य सर्वोत्तम प्रलेख है । इस पिछले प्रश्न में अधिक उपकरण सूचीबद्ध हैं ।
मुझे उम्मीद है कि यह कुछ चीजें साफ कर देगा! मेमोरी लीक को ट्रैक करना डीबगिंग में सबसे कठिन चीजों में से एक है। सौभाग्य।