दिलचस्प पोस्ट
अजगर: एन-लगभग-बराबर-लम्बी विभाजनों में एक सूची का टुकड़ा करना जेपीए (हाइबरनेट) और कस्टम तालिका उपसर्ग resultset का उपयोग करके कई रिकॉर्ड प्रदर्शित अपरिभाषित "कुल मूल्य" संपत्ति को पढ़ नहीं सकते मैं एक्लिप्स में एंड्रॉइड सपोर्ट लाइब्रेरी स्रोत को कैसे जोड़ूं? पायथन में एक सूची के माध्यम से लूप और इसे संशोधित करें स्प्राइट किट और कलर विथ प्रतिमान छवि वेब। एक्सएमएल का इस्तेमाल करते हुए वसंत में संदर्भ लोड करना 'प्राप्त-पैक': './.git' के लिए सेवा सक्षम नहीं है गोल किनारों के साथ UIBezierPath त्रिभुज कोड फ़ाइल से रनटाइम पर सी # कोड निष्पादित करें Schema.org शाखा का उपयोग करें itemref से jQuery लोड बाह्य साइट पृष्ठ एक आईईईई 754 डबल स्ट्रिंग में परिवर्तित करने के लिए एल्गोरिथ्म? Django व्यवस्थापक: कस्टम सूची में से एक को क्रमबद्ध करने के लिए कैसे करें- फ़ील्ड जिसमें कोई डेटाबेस फ़ील्ड नहीं है

सी # /। नेट ऑब्जेक्ट का उपयोग कितना मेमोरी करता है?

मैं एक ऐसे एप्लिकेशन को विकसित कर रहा हूं जिसमें वर्तमान में सैकड़ों ऑब्जेक्ट बनाए गए हैं

क्या वस्तु (वर्ग आवृत्ति) द्वारा आवंटित स्मृति (या अनुमानित) निर्धारित करना संभव है?

Solutions Collecting From Web of "सी # /। नेट ऑब्जेक्ट का उपयोग कितना मेमोरी करता है?"

आप जैसे मेमोरी प्रोफ़ाइलर का इस्तेमाल कर सकते हैं

.NET मेमोरी प्रोफाइलर ( http://memprofiler.com/ )

या

सीएलआर प्रोफाइलर (फ्री) ( http://clrprofiler.codeplex.com/ )

एक मोटे तौर पर यह हो सकता है कि आप किसी खास ऑब्जेक्ट के साथ क्या हो रहा है यह जानना चाहें

// Measure starting point memory use GC_MemoryStart = System.GC.GetTotalMemory(true); // Allocate a new byte array of 20000 elements (about 20000 bytes) MyByteArray = new byte[20000]; // Obtain measurements after creating the new byte[] GC_MemoryEnd = System.GC.GetTotalMemory(true); // Ensure that the Array stays in memory and doesn't get optimized away GC.KeepAlive(MyByteArray); 

प्रक्रिया विस्तृत सामान इस तरह शायद प्राप्त किया जा सकता है

 long Process_MemoryStart = 0; Process MyProcess = System.Diagnostics.Process.GetCurrentProcess(); Process_MemoryStart = MyProcess.PrivateMemorySize64; 

उम्मीद है की यह मदद करेगा 😉

एएनटीएस मेमोरी प्रोफाइलर आपको बताएगा कि प्रत्येक वस्तु / विधि / आदि के लिए कितना आवंटित किया गया है।

यहां एक संबंधित पोस्ट है जहां हमने संदर्भ प्रकार के आकार का निर्धारण करने पर चर्चा की।

आप WinDbg और एसओएस या SOSEX का प्रयोग भी कर सकते हैं (जैसे एसओएस के साथ बहुत अधिक कमांड और कुछ मौजूदा वाले सुधार के साथ) WinDbg एक्सटेंशन एक विशेष स्मृति पते पर किसी ऑब्जेक्ट का विश्लेषण करने के लिए कमांड का उपयोग करें! Objsize

याद करने के लिए एक बहुत ही महत्वपूर्ण वस्तु यह है कि objsize आपको केवल कक्षा का आकार देता है और जरूरी नहीं कि क्लास के अंदर मौजूद कुल वस्तुओं का आकार शामिल है – मुझे नहीं पता कि यह ऐसा क्यों नहीं करता क्योंकि यह काफी है निराशाजनक और भ्रामक समय पर।

मैंने कनेक्ट वेबसाइट पर 2 सुविधा सुझाव तैयार किए हैं जो VisualStudio में शामिल होने की इस क्षमता की मांग करते हैं। कृपया उन वस्तुओं के लिए वोट दें जिन्हें आप उन्हें जोड़कर देखना चाहेंगे!

https://connect.microsoft.com/VisualStudio/feedback/details/637373/add-feature-to-debugger-to-view-an-objects-memory-footprint-usage

https://connect.microsoft.com/VisualStudio/feedback/details/637376/add-feature-to-debugger-to-view-an-objects-rooted-references

संपादित करें: चार्ल्स ब्रेटाना द्वारा दिए गए उत्तर से कुछ जानकारी स्पष्ट करने के लिए मैं निम्नलिखित को जोड़ रहा हूं:

  1. ओपी ने एक 'ऑब्जेक्ट' के आकार के बारे में पूछा, 'क्लास' नहीं एक वस्तु एक वर्ग का एक उदाहरण है। हो सकता है कि आपका यही मतलब है?
  2. किसी ऑब्जेक्ट के लिए आवंटित स्मृति में जेटेट कोड शामिल नहीं है। जीआईटी कोड अपने स्वयं के 'जेआईटी कोड हीप' में रहता है।
  3. जीआईटी केवल विधि के आधार पर एक विधि पर कोड संकलित करती है – कक्षा स्तर पर नहीं। इसलिए अगर किसी विधि को कभी भी कक्षा के लिए नहीं बुलाया जाता है, तो यह कभी भी कंपित नहीं हुआ है और इस प्रकार कभी इसके लिए जेआईटी कोड हीप पर आवंटित स्मृति नहीं है।

एक तरफ, सीएलआर द्वारा उपयोग किए जाने वाले लगभग 8 भिन्न ढेर हैं:

  1. लोडर ढेर: सीएलआर ढांचे और प्रकार प्रणाली शामिल हैं
  2. उच्च आवृत्ति ढेर: स्टेटिक्स, मेथथ टैब्स, फील्डडेस, इंटरफ़ेस मैप
  3. कम आवृत्ति ढेर: ईईसीएलएएस, क्लासलोडर और लुकअप तालिकाओं
  4. स्टब हीप: सीएएस के लिए स्टब्स, कॉम रैपर, पी / इंवेक
  5. बड़ी ऑब्जेक्ट हीप: स्मृति आवंटन जो 85k बाइट्स से अधिक की आवश्यकता होती है
  6. जीसी ढेर: उपयोगकर्ता एप को निजीकृत हेप मेमोरी को आवंटित करता है
  7. जीआईटी कोड हीप: प्रबंधित कोड के लिए एमएसकोरिए (निष्पादन इंजन) और जेआईटी कंपाइलर द्वारा आवंटित मेमोरी
  8. प्रक्रिया / बेस हिएप: इंटरॉप / अप्रबंधित आवंटन, मूल स्मृति, आदि

HTH

अपने आवेदन में स्मृति आवंटन के लिए एक सामान्य अर्थ प्राप्त करने के लिए, WinDbg में निम्नलिखित sos कमांड का उपयोग करें

 !dumpheap -stat 

ध्यान दें कि! डंपहेप केवल आपको ऑब्जेक्ट प्रकार के बाइट्स को देता है, और किसी भी अन्य ऑब्जेक्ट प्रकारों के बाइट्स को इसमें शामिल नहीं करता है जो यह संदर्भ दे सकता है।

यदि आप विशिष्ट ऑब्जेक्ट प्रकार की कुल बाइट्स (आपके ऑब्जेक्ट से संबंधित सभी ऑब्जेक्ट के सभी बाइट्स को जोड़ सकते हैं) देखना चाहते हैं, तो डॉट ट्रेस – http://www.jetbrains.com/profiler/ जैसे मेमोरी प्रोफाइलर का उपयोग करें ।

प्रत्येक "कक्षा" के लिए पर्याप्त स्मृति की आवश्यकता होती है, यह सभी के लिए जेट-कंपाइल किए गए कोड को अपने सदस्यों के लिए रखता है जिन्हें रनटाइम कहा जाता है (हालांकि यदि आप कुछ समय के लिए एक विधि कॉल नहीं करते हैं, CLR उस स्मृति को जारी कर सकता है और अगर आप इसे फिर से कॉल करते हैं … फिर भी इसे फिर से कहते हैं … वर्ग में घोषित सभी स्थैतिक चर पकड़ने के लिए पर्याप्त मेमोरी … लेकिन यह मेमोरी केवल वर्ग प्रति एक बार आवंटित की जाती है, भले ही आप कितने क्लास बनाते हो।

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

संदर्भ चर (अन्य ऑब्जेक्ट्स के लिए refs) क्रमशः 4 या 8 बाइट्स (32/64 बिट ओएस?) int16, Int32, Int64 ले 2,4 या 8 बाइट्स लेते हैं …

स्ट्रिंग वेरिएबल कुछ मेटा डेटा तत्वों के लिए अतिरिक्त भंडार लेता है, (साथ ही पते सूचक का आकार)

इसके अलावा, किसी ऑब्जेक्ट में प्रत्येक संदर्भ चर को "अप्रत्यक्ष रूप से" माना जा सकता है, जिसमें उस ऑब्जेक्ट द्वारा ढेर पर लिखी जाने वाली मेमोरी शामिल होती है, हालांकि आप उस स्मृति को उस ऑब्जेक्ट से संबंधित नहीं मानते हैं जो कि वेरिएबल नहीं है यह संदर्भ …

आदि आदि।

यदि आप कर सकते हैं – इसे सीरियल करें!

 Dim myObjectSize As Long Dim ms As New IO.MemoryStream Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter() bf.Serialize(ms, myObject) myObjectSize = ms.Position 

रनटाइम पर किसी ऑब्जेक्ट के आकार का क्या शैक्षणिक सवाल है? और यह दिलचस्प है, लेकिन यह केवल एक प्रोफाइलर द्वारा ठीक से उत्तर दिया जा सकता है जो चलने की प्रक्रिया से जुड़ा है। मैंने हाल ही में इस पर गौर करते हुए काफी समय व्यतीत किया और निर्धारित किया कि कोई सामान्य पद्धति नहीं है जो सटीक और तेज़ पर्याप्त है कि आप कभी इसे उत्पादन प्रणाली में उपयोग करना चाहते हैं। संख्यात्मक प्रकारों के सरणियों जैसे साधारण मामलों में आसान उत्तर होते हैं, लेकिन इससे परे यह सबसे अच्छा जवाब होगा कि इसे काम करने की कोशिश करने पर परेशान न हो। आप यह जानना चाहते हैं? क्या कोई अन्य जानकारी उपलब्ध है जो एक ही उद्देश्य की सेवा कर सकती है?

मेरे मामले में मैं इस सवाल का जवाब देना चाहता था क्योंकि मेरे पास कई डेटा थे जो उपयोगी थे, लेकिन अधिक महत्वपूर्ण सेवाओं के लिए राम को मुक्त करने के लिए त्याग दिया जा सकता था। पोस्टर लड़के यहां एक अंडो स्टैक और कैश हैं

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