2012-05-02 24 views
8

मेरा एक सहयोगी आश्वस्त है कि ओरेकल के odp.net ado.net कार्यान्वयन में एक स्मृति रिसाव है। उन्होंने कहा कि एक परीक्षण कार्यक्रम इस सिद्धांत का परीक्षण करने के लिए लिखा है और क्रम में प्रत्येक वस्तु पर निपटाने निर्धारित करने के लिए कितना स्मृति को मुक्त कर दिया जा रहा है बुला के बाद निम्नलिखित कर रही है:जीसी.कोलेक्ट() और प्रदर्शन काउंटर

PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes"); 

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

float mem = p.NextValue(); 

परिणामस्वरूप प्रदर्शन मूल्य तो लिया गया एक मूल्य के साथ तुलना की जाती है वस्तु का निपटान करने से पहले। क्या यह सटीक परिणाम देगा?

+10

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

+0

क्या आपने अपनी प्रक्रिया के भीतर .NET मेमोरी और सिस्टम मेमोरी उपयोग की निगरानी करने के लिए ProcessExplorer का उपयोग करने का प्रयास किया है? आपने यह नहीं बताया है कि किस प्रकार की मेमोरी लीक हो रही है ... – GregC

+0

हम नहीं जानते कि किस प्रकार की मेमोरी लीक हो रही है, यह परीक्षण के कारण का हिस्सा है, यह पुष्टि करने के लिए कि कोई समस्या है। मेरा सवाल यह पुष्टि करना है कि परीक्षण वैध है या नहीं। – zaq

उत्तर

2

मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका GC.GetTotalMemory(true) का उपयोग करना है। ऑब्जेक्ट आवंटित करने से पहले आप इसे कॉल कर सकते हैं ताकि रिकॉर्ड किया जा सके कि कितनी मेमोरी आवंटित की गई थी। फिर आप अपना ऑब्जेक्ट बनाते हैं, शायद उस पर कुछ ऑपरेशन करें, इसका निपटान करें, सुनिश्चित करें कि इसमें कोई संदर्भ नहीं है (शायद स्थानीय चर को null पर सेट करें) और फिर इसे फिर से कॉल करें।

हो सकता है कि दिए गए मान पूरी तरह से सटीक नहीं हो सकता है, प्रलेखन प्रति रखें, विधि वापस आ जाएगी:

अनेक बाइट की संख्या का सबसे अच्छा उपलब्ध सन्निकटन वर्तमान में कामयाब स्मृति में आवंटित है कि ।

उसके बाद, आप दो मानों की तुलना कर सकते हैं। यदि आप इसे बार-बार करते हैं, तो आप देख सकते हैं कि ऑब्जेक्ट वास्तव में प्रबंधित स्मृति को लीक कर रहा है या नहीं।

बेशक, यदि ऑब्जेक्ट अप्रबंधित स्मृति को लीक करता है तो यह आपकी सहायता नहीं करेगा।

एक और विकल्प मेमोरी प्रोफाइलर का उपयोग करना है, लेकिन यदि आप जानते हैं कि स्मृति वास्तव में रिसाव कहां हो सकती है तो यह एक ओवरकिल हो सकता है।

+0

परिणामों को बेहतर तरीके से प्राप्त करने के विचार के लिए धन्यवाद। क्या इसका मतलब है कि मेरे द्वारा पोस्ट किए गए दृष्टिकोण में कुछ गड़बड़ है? यह एक बेहतर दृष्टिकोण क्यों है? – zaq

+2

हाँ, आपका दृष्टिकोण गलत है, हंस पासेंट द्वारा टिप्पणी पढ़ें। जब सीएलआर कचरा इकट्ठा करता है, तो यह आमतौर पर स्मृति को सिस्टम पर वापस नहीं लौटाता है, इसलिए आपको उपलब्ध बाइट्स में कोई बदलाव नहीं दिखाई दे सकता है, भले ही स्मृति वास्तव में मुक्त हो। – svick