निजी बाइट्स, वर्चुअल बाइट्स, वर्किंग सेट क्या है?


490

मैं एक प्रक्रिया में डिबग मेमोरी लीक को परफ्यूम विंडो उपयोगिता का उपयोग करने की कोशिश कर रहा हूं।

यह है कि कैसे perfmon शब्दों की व्याख्या करता है:

वर्किंग सेट इस प्रक्रिया के वर्किंग सेट का बाइट्स में वर्तमान आकार है। वर्किंग सेट प्रक्रिया में थ्रेड्स द्वारा हाल ही में छुआ गया मेमोरी पेज का सेट है। यदि कंप्यूटर में मुफ्त मेमोरी एक सीमा से ऊपर है, तो पृष्ठ प्रक्रिया के कार्य समूह में छोड़ दिए जाते हैं भले ही वे उपयोग में न हों। जब मुफ्त मेमोरी एक सीमा से नीचे गिरती है, तो पेज वर्किंग सेट से छंटनी की जाती हैं। यदि उनकी जरूरत है तो वे मुख्य मेमोरी छोड़ने से पहले वर्किंग सेट में वापस सॉफ्ट-फ़ॉल्ट हो जाएंगे।

वर्चुअल बाइट्स वर्तमान आकार है, बाइट्स में, वर्चुअल एड्रेस स्पेस की प्रक्रिया का उपयोग कर रहा है। आभासी पता स्थान का उपयोग आवश्यक रूप से डिस्क या मुख्य मेमोरी पेजों के संगत उपयोग का नहीं करता है। वर्चुअल स्पेस परिमित है, और यह प्रक्रिया पुस्तकालयों को लोड करने की क्षमता को सीमित कर सकती है।

निजी बाइट्स वर्तमान आकार का है, बाइट्स में, स्मृति का है कि इस प्रक्रिया को आवंटित किया गया है जिसे अन्य प्रक्रियाओं के साथ साझा नहीं किया जा सकता है।

ये प्रश्न मेरे पास हैं:

क्या यह निजी बाइट्स है, जिन्हें मुझे यह सुनिश्चित करने के लिए मापना चाहिए कि क्या प्रक्रिया में कोई लीक है क्योंकि इसमें कोई साझा पुस्तकालय शामिल नहीं है और यदि कोई लीक हो रहा है, तो क्या यह प्रक्रिया से ही आएगा?

प्रक्रिया द्वारा भस्म की गई कुल मेमोरी क्या है? क्या यह वर्चुअल बाइट्स है या यह वर्चुअल बाइट्स और वर्किंग सेट का योग है?

क्या प्राइवेट बाइट्स, वर्किंग सेट और वर्चुअल बाइट्स के बीच कोई संबंध है?

क्या कोई अन्य उपकरण हैं जो स्मृति उपयोग का बेहतर विचार देते हैं?


3
एक बेहतर उपकरण वेलग्रिंड / हेलग्रिंड होगा, लेकिन दुर्भाग्य से विंडोज के तहत नहीं :(
कोर्नेल किसेल्विकेज़

क्या यह निजी बाइट है, मुझे यह सुनिश्चित करने के लिए मापना चाहिए कि क्या प्रक्रिया में कोई रिसाव हो रहा है यदि किसी प्रक्रिया के निजी बाइट्स नहीं बढ़ते हैं, तो आपके पास कोई मेमोरी लीक नहीं है। यदि वे बढ़ते हैं तो यह मेमोरी लीक के कारण हो सकता है और यह मेमोरी विखंडन के कारण हो सकता है। मुझे लगता है कि निजी बाइट्स के विकास को देखकर यह कहना मुश्किल है कि इसका वास्तव में क्या मतलब है।

@SergeiKurenkov एक बात हम कह सकते हैं कि यह "मेमोरी विखंडन" के कारण नहीं होगा।
जेमी हनराहन

जवाबों:


517

इस प्रश्न का संक्षिप्त उत्तर यह है कि इनमें से कोई भी मान इस बात का विश्वसनीय संकेतक नहीं है कि एक निष्पादन योग्य मेमोरी वास्तव में कितना उपयोग कर रही है, और उनमें से कोई भी स्मृति रिसाव को डीबग करने के लिए वास्तव में उपयुक्त नहीं है।

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

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

वर्चुअल बाइट्स पूरी प्रक्रिया द्वारा कब्जे में लिया गया कुल वर्चुअल एड्रेस स्पेस है। यह काम करने वाले सेट की तरह है, इस अर्थ में कि इसमें मेमोरी-मैप्ड फ़ाइलें (साझा DLLs) शामिल हैं, लेकिन इसमें स्टैंडबाय सूची में डेटा भी शामिल है और डेटा जो पहले ही पृष्ठांकित हो चुका है और कहीं न कहीं डिस्क पर पेजफाइल में बैठा है। भारी लोड के तहत एक प्रणाली पर हर प्रक्रिया द्वारा उपयोग किए जाने वाले कुल आभासी बाइट्स वास्तव में मशीन की तुलना में काफी अधिक मेमोरी तक जोड़ देंगे।

तो रिश्ते हैं:

  • निजी बाइट्स हैं जो आपके ऐप को वास्तव में आवंटित किए गए हैं, लेकिन पेजफाइल का उपयोग शामिल है;
  • वर्किंग सेट गैर-पृष्ठांकित निजी बाइट्स प्लस मेमोरी-मैप्ड फ़ाइलें है;
  • वर्चुअल बाइट्स वर्किंग सेट प्लस पेजेड प्राइवेट बाइट्स और स्टैंडबाय लिस्ट हैं।

यहाँ एक और समस्या है; जिस तरह साझा लाइब्रेरी आपके एप्लिकेशन मॉड्यूल के अंदर मेमोरी को आवंटित कर सकती है, जिससे आपके ऐप के प्राइवेट बाइट्स में रिपोर्ट की जाने वाली संभावित गलत सकारात्मकता हो सकती है , आपका एप्लिकेशन भी साझा किए गए मॉड्यूल के अंदर मेमोरी को आवंटित करने से समाप्त हो सकता है , जिससे झूठी नकारात्मकता हो सकती है। । इसका मतलब है कि आपके आवेदन के लिए मेमोरी लीक होना वास्तव में संभव है जो कभी भी निजी बाइट्स में खुद को प्रकट नहीं करता है। अकारण, लेकिन संभव है।

निजी बाइट्स आपके निष्पादन योग्य मेमोरी की मात्रा का एक उचित अनुमान है और इसका उपयोग मेमोरी लीक के लिए संभावित उम्मीदवारों की सूची को कम करने में मदद करने के लिए किया जा सकता है ; यदि आप संख्या को लगातार और अंतहीन रूप से बढ़ते और बढ़ते हुए देखते हैं, तो आप एक लीक के लिए उस प्रक्रिया की जांच करना चाहेंगे। हालाँकि, यह साबित नहीं किया जा सकता है कि कोई रिसाव है या नहीं है।

विंडोज में मेमोरी लीक का पता लगाने / सही करने के लिए सबसे प्रभावी उपकरण वास्तव में विजुअल स्टूडियो है (लिंक मेमोरी पेज के लिए वीएस का उपयोग करने पर पृष्ठ पर जाता है, उत्पाद पृष्ठ पर नहीं)। तर्कसंगत शुद्धिकरण एक और संभावना है। Microsoft के पास इस विषय पर एक अधिक सामान्य सर्वोत्तम प्रलेख है । इस पिछले प्रश्न में अधिक उपकरण सूचीबद्ध हैं ।

मुझे उम्मीद है कि यह कुछ चीजें साफ कर देगा! मेमोरी लीक को ट्रैक करना डीबगिंग में सबसे कठिन चीजों में से एक है। सौभाग्य।


26
मुझे डर है कि आप जवाब नहीं दे रहे हैं। निजी बाइट्स मेमोरी (रैम) की मात्रा को संदर्भित करते हैं जो कि निष्पादन योग्य प्रक्रिया ने पूछा है - न केवल भौतिक मेमोरी। इस प्रकार आप निश्चित रूप से निजी बाइट्स की निगरानी करके स्मृति रिसाव के अधिकांश मामलों का निरीक्षण कर सकते हैं। प्रयास करें :: VisualAlloc स्मृति का एक बड़ा हिस्सा (1.5G) कहने के लिए। आपको यह देखने में सक्षम होना चाहिए कि आपके निजी बाइट्स काम करने वाले सेट से बड़े हैं। जो यह साबित करता है कि आपका "वर्किंग सेट प्राइवेट बाइट्स प्लस मेमोरी-मैप्ड फाइल्स है" गलत है।
जे झू

4
वास्तव में, मैं लिखता हूं कि समझ "वर्किंग सेट इन-मेमोरी प्राइवेट बाइट्स प्लस मेमोरी-मैप्ड फाइलें है"। और निजी बाइट्स की अदला-बदली की जा सकती है - आप निजी बाइट्स को मशीन में मौजूद भौतिक मेमोरी से बड़ा देख सकते हैं।
जे झू

2
@ चेतावनी: विश्वसनीय संकेतक और डीबगिंग के लिए उपयुक्त के बारे में आपका पहला बयान भ्रामक है। निजी बाइट्स एक रिसाव अनुप्रयोग मेमोरी स्पेस का एक विश्वसनीय संकेतक है। यह एक निर्भर DLL और अप्रत्यक्ष हो सकता है लेकिन यह एप्लिकेशन मेमोरी स्पेस में एक रिसाव है। क्या आप बता सकते हैं कि डिबगिंग के लिए इसका उपयोग क्यों नहीं किया जा सकता है? आवेदन प्रक्रिया का एक पूर्ण मेमोरी डंप हमें यह बताना चाहिए कि इस मेमोरी का उपभोग क्या है। मुझे यकीन नहीं है कि मैं समझता हूं कि इसका उपयोग डिबगिंग के लिए क्यों नहीं किया जा सकता है। क्या आप कुछ प्रकाश डाल सकते हैं?
G33kKahuna

@ G33kKahuna: यह मेरे लिए स्पष्ट नहीं है कि मेमोरी डंप आपको कैसे बताएगा कि किसी सार्थक अर्थ में मेमोरी का उपभोग किया जा रहा है - जब तक कि "क्या" से आपका मतलब "क्या मॉड्यूल" है, लेकिन तब आपके पास एक स्नैपशॉट है, तो आप अभी भी नहीं देख सकते हैं कौन सा मॉड्यूल वास्तव में समय के साथ मेमोरी को लीक कर रहा है जब तक कि आप समय के साथ और कसकर नियंत्रित परिस्थितियों में कई डंप नहीं लेते हैं। अधिक अक्षम और अविश्वसनीय डिबगिंग रणनीति की कल्पना करना कठिन है। इन दिनों हर जगह प्रोफाइलर हैं; एक का उपयोग करें।
Aaronaught

1
एक पूर्ण भागो! Objsize, यह तत्काल ढेर में किसी भी पिन की गई वस्तुओं को दिखाना चाहिए। आप eeheap -gc की जाँच करके पुष्टि कर सकते हैं। यह आपको दिखाना चाहिए कि वॉल्यूम कहाँ अटक गया है। आमतौर पर, यदि उपरोक्त सभी आदेशों के साथ कोई संकेत उपलब्ध नहीं हैं, तो आपके निजी बाइट्स का उपभोग जीसी में अनियंत्रित वस्तुओं द्वारा किया जाता है। अब या तो ghandles या gcleaks पर जाएँ। ये कमांड आपको यह बताना चाहिए कि किस प्रकार / ऑब्जेक्ट पते को मैप नहीं किया जा सकता है। सूचक अभी भी है, लेकिन ऑब्जेक्ट चला गया है। यह असंबंधित घटना संचालकों के लिए ऐसी स्पष्ट समस्या है।
G33kKahuna

10

आपको मेमोरी लीक को निर्धारित करने के लिए परफ्यूम, टास्क मैनेजर या उस जैसे किसी टूल का उपयोग करने की कोशिश नहीं करनी चाहिए। वे रुझानों की पहचान करने के लिए अच्छे हैं, लेकिन बहुत कुछ नहीं। वे जिस संख्या में निरपेक्ष रूप से रिपोर्ट करते हैं, वह बहुत अस्पष्ट और एक विशिष्ट कार्य के लिए उपयोगी होती है जैसे कि मेमोरी लीक का पता लगाना।

इस प्रश्न के पिछले उत्तर ने विभिन्न प्रकार के क्या हैं, इसकी एक शानदार व्याख्या दी है।

आप एक उपकरण सिफारिश के बारे में पूछते हैं: मैं मेमोरी वैलिडेटर की सलाह देता हूं। निगरानी अनुप्रयोगों में सक्षम जो स्मृति आवंटन के अरबों बनाते हैं।

http://www.softwareverify.com/cpp/memory/index.html

डिस्क्लेमर: मैंने मेमोरी वैलिडेटर डिजाइन किया है।


1
मैं एक साधारण वर्ग फ़ाइल (जावा में) भी नहीं चला सकता हूँ? क्या देता है?
jn1kk

मुझे संदेह है कि स्टीफन और डेविल किसी तरह से संबंधित हैं या यहां तक ​​कि क्लोन किया गया है ...: डी;)
रॉबर्ट कोरिटनिक

@StephenKellett, क्या कोई परीक्षण संस्करण है?
पचेरियर

@ स्पेसर यदि आप लिंक का अनुसरण करते हैं तो पृष्ठ के बाईं ओर खरीद विकल्प के ठीक ऊपर x86 और x64 दोनों संस्करणों के लिए एक परीक्षण है।
ब्रैडले ए। टेट्र्टेल्ट

10

परफ्यूम काउंटर की परिभाषा शुरुआत से ही टूटी हुई है और किसी कारण से सही होने के लिए बहुत कठिन प्रतीत होती है।

MSDN पर " मेमोरी मैनेजमेंट का रहस्य " वीडियो में विंडोज मेमोरी मैनेजमेंट का एक अच्छा अवलोकन उपलब्ध है : यह मेमोरी लीक (जैसे वर्किंग सेट मैनेजमेंट) को ट्रैक करने के लिए आवश्यकता से अधिक विषयों को कवर करता है, लेकिन संबंधित विषयों में पर्याप्त विवरण देता है।


आपको परफ़ॉर्म काउंटर विवरण के साथ समस्या का संकेत देने के लिए, MSDN पर " निजी बाइट्स प्रदर्शन काउंटर - खबरदार! " से निजी बाइट्स के बारे में अंदर की कहानी है :

प्रश्न: कब एक निजी बाइट एक निजी बाइट नहीं है?

A: जब यह निवासी नहीं है।

निजी बाइट्स काउंटर प्रक्रिया की प्रतिबद्ध प्रभार रिपोर्ट करता है। यह कहना है, स्वैप की फ़ाइल में आवंटित की गई जगह की मात्रा को उस मेमोरी में निजी मेमोरी की सामग्री को रखने के लिए आवंटित किया गया है जिसे इसे स्वैप किया गया है। नोट: मैं आरक्षित शब्द में वर्चुअल मेमोरी के साथ संभावित भ्रम के कारण "आरक्षित" शब्द से बच रहा हूं जो प्रतिबद्ध नहीं है।


MSDN पर " प्रदर्शन योजना " से:

३.३ निजी बाइट्स

३.३.१ वर्णन

निजी मेमोरी, एक प्रक्रिया के लिए आवंटित मेमोरी के रूप में परिभाषित की जाती है जिसे अन्य प्रक्रियाओं द्वारा साझा नहीं किया जा सकता है। जब एक मशीन पर ऐसी कई प्रक्रियाएं चलती हैं तो यह मेमोरी साझा मेमोरी से अधिक महंगी होती है। (पारंपरिक) अप्रबंधित dll में निजी मेमोरी आमतौर पर C ++ स्टैटिक्स का गठन करती है और dll के कुल कामकाजी सेट के 5% के क्रम की होती है।


1
यह कैसे टूट गया है के बारे में बेहूदा उदाहरणों के कारण वोट दें!
ब्रूनो ब्रेंट

पहली बोली गलत है। "निजी बाइट्स" का आवंटन करने के लिए "स्वैप फ़ाइल में आवंटित" (जिसे वास्तव में पेजफाइल कहा जाता है) कुछ भी करने की आवश्यकता नहीं होती है। आपको "निजी बाइट्स" के लिए पेजफाइल भी आवंटित करने की आवश्यकता नहीं है। वास्तव में, निजी बाइट्स आवंटित करना तुरंत कहीं भी किसी भी स्थान का उपयोग नहीं करता है , और जितना आवंटित किया गया था उतना कभी भी उपयोग नहीं कर सकता है।
जेमी हनराहन

दूसरी बोली ज्यादा बेहतर नहीं है। डीएलएल कोड में उपयोग किए जाने वाले निजी बाइट्स जरूरी नहीं कि डीएलएल के भीतर ही सांख्यिकीय रूप से आवंटित किए गए हों। DLL कोड को VirtualAlloc, HeapAlloc (CRTL में नया और माल्टा) कहते हैं, आदि के लिए पूरी तरह से स्वतंत्र है। यह निजी मेमोरी साइज को वर्किंग सेट साइज के प्रतिशत के रूप में वर्णित करने की कोशिश करता है, जो निरर्थक है। पूर्व एक आभासी आकार है (और समान इनपुट वाले कोड के हर उपयोग के लिए समान होगा) जबकि बाद वाला भौतिक है (जो कि स्मृति से समृद्ध या - के आधार पर, एक रन से दूसरे तक मौलिक रूप से भिन्न हो सकता है) तारांकित मशीन है)।
जेमी हनराहन

5

यहाँ एक दिलचस्प चर्चा है: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e635bb0bfe9e/ इस धागे की मेरी समझ यह है कि छोटे आवंटन मुक्त हैं निजी बाइट्स या कार्य सेट में परिलक्षित नहीं।

कहानी संक्षिप्त में:

अगर मैं फोन करूँ

p=malloc(1000);
free(p);

तब निजी बाइट्स केवल आवंटन को दर्शाते हैं, न कि डीलक्लोकेशन को।

अगर मैं फोन करूँ

p=malloc(>512k);
free(p);

तब निजी बाइट्स आवंटन और डीललोकेशन को सही ढंग से दर्शाते हैं।


7
यह इस तथ्य से समझाया गया है कि सी मानक पुस्तकालय मेमोरी फ़ंक्शंस एक कस्टम या Win32 हीप का उपयोग करते हैं जो निम्न-स्तरीय प्रक्रिया-स्तरीय मेमोरी प्रबंधन के शीर्ष पर एक स्मृति प्रबंधन तंत्र है।
Kyberias

@ कियबीरिया, तो हम उससे नीचे कैसे आते हैं ?
पचेरियर

जबकि (1) नि: शुल्क (मॉलॉक (1000)); // क्या इससे प्राइवेट बाइट्स हमेशा के लिए बढ़ जाएंगे?
फ्रेंकस्पाइक

2
@franckspike: नहीं, यह एक निश्चित बिंदु तक बढ़ जाएगा (आम तौर पर लगभग 4 kB, लेकिन यह अलग-अलग हो सकता है) और फिर बंद हो जाता है, क्योंकि CRT OS से नए पृष्ठों का अनुरोध करने के बजाय पहले से मुक्त मेमोरी का फिर से उपयोग करेगा।
मिरल

@ स्पेसर: आप VirtualAlloc और VirtualFree कह सकते हैं।
जेमी हनराहन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.