2017-09-11 54 views
5

डीबगिंग उद्देश्यों के लिए, मैं इस छोटे से स्थिर विधि लिखा है:एप्लिकेशन मेमोरी उपयोग की निगरानी करने का सही तरीका क्या है?

public static long CheckMemory(long maxMemorySizeBytes) 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 

    var usedMemoryBytes = Process.GetCurrentProcess().VirtualMemorySize64; 
    if (usedMemoryBytes > maxMemorySizeBytes) 
     Debugger.Break(); 

    return usedMemoryBytes; 
} 

किसी कारण से, VirtualMemorySize64 बहुत सारे क्या दृश्य स्टूडियो निदान के औजार विंडो दिखाया जा रहा है, साथ ही क्या कार्य प्रबंधक दिखा रहा है और अधिक से अधिक स्मृति लौटने रहता है ।

  • निदान के औजार: ~ 250 एमबी
  • कार्य प्रबंधक: ~ 120 एमबी
  • VirtualMemorySize64: विशिष्ट उदाहरण मैं अब चल रहा हूँ के लिए, यहाँ नंबर दिए गए हैं ~ 1100 एमबी

ऐसे बड़े मतभेद क्यों हैं और मैं ऐप के भीतर से मेमोरी उपयोग को सही तरीके से कैसे ट्रैक करूं?

उत्तर

4

VirtualMemorySize आपकी प्रक्रिया का उपयोग करने वाली सभी वर्चुअल मेमोरी को मापता है। जिसमें आपकी मशीन पर अन्य सभी प्रक्रियाओं द्वारा साझा किए गए पृष्ठ शामिल हैं। जो एक .NET प्रोग्राम में ऑपरेटिंग सिस्टम, सीएलआर, जिटर और ngen-ed फ्रेमवर्क असेंबली शामिल है।

नैदानिक ​​उपकरण - अपने आवेदन की निजी बाइट्स मीट्रिक का लाइव ग्राफ प्रदर्शित करता है। निजी बाइट्स एक प्रक्रिया आवंटित स्मृति की कुल मात्रा का एक उपाय है, जिसमें अन्य प्रक्रियाओं के साथ साझा स्मृति शामिल नहीं है।

कार्य प्रबंधक में, डिफ़ॉल्ट रूप से, आप "निजी वर्किंग सेट" स्मृति है, जो एक प्रक्रिया है कि अन्य प्रक्रियाओं के बीच साझा नहीं किया जा सकता द्वारा इस्तेमाल किया स्मृति की मात्रा है देखते हैं।

तो:

आप आप कितना स्मृति का उपयोग कर रहे एक विचार प्राप्त करना चाहते हैं, VirtualMemorySize, कार्य सेट और निजी बाइट्स के लिए पुनः प्राप्त एक प्रक्रिया।

  • निजी बाइट एक ही बात कार्य प्रबंधक गुमराह "के रूप में वी एम आकार" को संदर्भित करता है।
  • कार्य सेट क्या कार्य प्रबंधक कॉल "मेम प्रयोग" है, जो प्रक्रियाओं 'पता स्थान का भाग है ("निजी बाइट्स" प्लस स्मृति मैप की गई फ़ाइलें) है कि रैम में वर्तमान निवासी है और संदर्भित किया जा सकता पेज गलती के बिना)।
  • वर्चुअल मेमरी आकार प्रक्रिया का कुल वर्चुअल पता स्थान है, जिसमें निजी बाइट्स और मेमोरी-मैप किए गए सामान दोनों शामिल हैं।

आप प्रक्रियाओं 'VirtualMemorySize के सभी को जोड़ने, तो आप की संभावना मिल जाएगा यह करने के लिए जिस तरह से अधिक स्मृति की तुलना में आप वास्तव में है कहते हैं। ऐसा इसलिए है क्योंकि उन स्मृति-मैप की गई फ़ाइलों, EXEs, DLLs, आदि को प्रक्रियाओं के बीच साझा किया जा सकता है; और रैम में एक ही भौतिक पृष्ठ को एक से अधिक प्रक्रिया की पता स्थान में एक बार में एक्सेस किया जा सकता है।

+4

उत्कृष्ट उत्तर, बहुत बहुत धन्यवाद। सी # विशेष रूप से रुचि रखने वाले लोगों के लिए एक संदर्भ के रूप में: ** निजी बाइट ** 'प्रक्रिया है। निजी मेमरी साइज 64' और ** कार्य सेट **' प्रक्रिया है। कार्यप्रणालीसेट 64 '। –

संबंधित मुद्दे