दिलचस्प पोस्ट
विंडोज में JRE स्थापना निर्देशिका कोणीय 2 एचटीटीपी के लिए कोई प्रदाता आप किस साल गणित की अनदेखी करते हैं? लॉगिन द्वारा अनुरोधित डेटाबेस "परीक्षण" नहीं खोल सकता लॉगिन विफल हुआ। उपयोगकर्ता 'xyz \ ASPNET' के लिए प्रवेश विफल JQuery में ब्राउज़र में टूलटिप को अक्षम कैसे करें? एक TensorFlow मॉडल के साथ भविष्यवाणियां बनाना मैं स्प्रिंग बूट को कैसे बता सकता हूं जो मुख्य वर्ग को निष्पादन योग्य जार के लिए उपयोग करता है? क्या मैं कभी वर्दी बफर या शेडर स्टोरेज बफर ऑब्जेक्ट के अंदर `vec3` का उपयोग करूँ? गैर अवरुद्ध कार्यकर्ता – फ़ाइल प्रतिलिपि में बाधा डालें सी ++, __ट्र्री और कोशिश / पकड़ / अंत में इमॅप को सी # में एक्सेस करना मुझे कैसे पता चलेगा कि मैंने जावास्क्रिप्ट को स्क्रॉल करना बंद कर दिया है रेल में url सहायकों के लिए मैं डिफ़ॉल्ट होस्ट कैसे सेट करूं? आप कैसे निर्धारित कर सकते हैं कि सीएसएस वर्ग जावास्क्रिप्ट के साथ मौजूद है? कैसे निष्पादन योग्य जार फ़ाइल बनाने के लिए?

.NET में मेमोरी लीक्स को खोजने के लिए कौन से रणनीतियों और टूल उपयोगी हैं?

मैंने 10 साल के लिए सी ++ लिखा है। मुझे स्मृति समस्याओं का सामना करना पड़ा, लेकिन उन्हें उचित प्रयास के साथ तय किया जा सकता था।

पिछले कुछ सालों से मैं सी # को लिख रहा हूं मुझे लगता है मुझे अभी भी बहुत सारी स्मृति समस्याएं मिलती हैं गैर-नियति के कारण उन्हें निदान और ठीक करना मुश्किल है, और क्योंकि सी # दर्शन यह है कि आपको ऐसी चीजों के बारे में चिंता करने की ज़रूरत नहीं है, जब आप निश्चित रूप से करते हैं।

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

.NET में मेमोरी लीक से निपटने के लिए किस प्रकार की रणनीतियों और उपकरण उपयोगी हैं?

Solutions Collecting From Web of ".NET में मेमोरी लीक्स को खोजने के लिए कौन से रणनीतियों और टूल उपयोगी हैं?"

जब मैं मेमोरी रिसाव को संदेह करता हूं तो मैं स्कैटेक के मेमप्रोफाइल का उपयोग करता हूं

अब तक, मुझे यह बहुत ही विश्वसनीय और शक्तिशाली होना पाया है। उसने कम से कम एक अवसर पर अपना बेकन बचा लिया है

जीसी, नेट आईएमओ में बहुत अच्छी तरह से काम करती है, लेकिन किसी भी अन्य भाषा या प्लेटफ़ॉर्म की तरह, अगर आप बुरा कोड लिखते हैं, बुरी चीजें होती हैं

बस भूल-से निपटने की समस्या के लिए, इस ब्लॉग पोस्ट में वर्णित समाधान का प्रयास करें । यहाँ सार है:

public void Dispose () { // Dispose logic here ... // It's a bad error if someone forgets to call Dispose, // so in Debug builds, we put a finalizer in to detect // the error. If Dispose is called, we suppress the // finalizer. #if DEBUG GC.SuppressFinalize(this); #endif } #if DEBUG ~TimedLock() { // If this finalizer runs, someone somewhere failed to // call Dispose, which means we've failed to leave // a monitor! System.Diagnostics.Debug.Fail("Undisposed lock"); } #endif 

हमने हमारी परियोजना में रेड गेट सॉफ्टवेयर द्वारा एंट्स प्रोफेलर प्रो का उपयोग किया है यह सभी .NET भाषा-आधारित अनुप्रयोगों के लिए वास्तव में अच्छी तरह से काम करता है।

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

संपादित करें: "मांग पर बढ़ोतरी" से मेरा क्या मतलब है इसका एक और स्पष्टीकरण है। हमारे डेटाबेस के हमारे ऑब्जेक्ट मॉडल में हम बच्चे ऑब्जेक्ट को बेनकाब करने के लिए एक मूल ऑब्जेक्ट की प्रॉपर्टी का उपयोग करते हैं। उदाहरण के लिए यदि हमारे पास कुछ रिकॉर्ड था जो किसी अन्य "विस्तार" या "लुकअप" रिकॉर्ड को एक-एक-एक आधार पर संदर्भित करता है तो हम इसे इस तरह बनाते हैं:

 class ParentObject Private mRelatedObject as New CRelatedObject public Readonly property RelatedObject() as CRelatedObject get mRelatedObject.getWithID(RelatedObjectID) return mRelatedObject end get end property End class 

हमने पाया है कि ऊपर की व्यवस्था ने कुछ वास्तविक मेमोरी और प्रदर्शन समस्याओं का निर्माण किया था जब स्मृति में बहुत सारे रिकॉर्ड थे इसलिए हमने उन सिस्टम पर स्विच कर दिया जहां ऑब्जेक्ट केवल अनुरोध किए जाने पर ही फुलाया गया था, और डेटाबेस कॉल केवल तभी आवश्यक थे जब आवश्यक हो:

 class ParentObject Private mRelatedObject as CRelatedObject Public ReadOnly Property RelatedObject() as CRelatedObject Get If mRelatedObject is Nothing mRelatedObject = New CRelatedObject End If If mRelatedObject.isEmptyObject mRelatedObject.getWithID(RelatedObjectID) End If return mRelatedObject end get end Property end class 

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

आपको अभी भी स्मृति के बारे में चिंता करने की ज़रूरत है जब आप प्रबंधित कोड लिख रहे हों जब तक कि आपका आवेदन तुच्छ न हो। मैं दो चीजों का सुझाव दूंगा: पहला, सी # के माध्यम से सीएलआर पढ़ें क्योंकि यह आपको .net मेमोरी प्रबंधन को समझने में मदद करेगा। दूसरा, CLRProfiler (माइक्रोसॉफ्ट) जैसे उपकरण का प्रयोग करना सीखें इससे आपको यह पता चलेगा कि आपकी मेमोरी रिसाव क्या हो रहा है (जैसे आप अपने बड़े ऑब्जेक्ट ढेर विखंडन पर एक नज़र डाल सकते हैं)

क्या आप अप्रबंधित कोड का उपयोग कर रहे हैं? अगर आप अप्रबंधित कोड का उपयोग नहीं कर रहे हैं, तो माइक्रोसॉफ्ट के अनुसार, पारंपरिक अर्थों में स्मृति लीक संभव नहीं है।

हालांकि किसी एप्लिकेशन द्वारा उपयोग की जाने वाली मेमोरी को जारी नहीं किया जा सकता है, इसलिए एप्लिकेशन के स्मृति में आवंटन आवेदन के पूरे जीवनकाल में बढ़ सकता है।

Microsoft.com पर आम भाषा रनटाइम में मेमोरी लीक की पहचान कैसे करें

स्मृति रिसाव एक। NET फ्रेमवर्क अनुप्रयोग में हो सकता है जब आप अनुप्रयोग के हिस्से के रूप में अप्रबंधित कोड का उपयोग करते हैं। यह अप्रबंधित कोड स्मृति को रिसाव कर सकता है, और .NET फ़्रेमवर्क रनटाइम उस समस्या को हल नहीं कर सकता।

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

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

एक आम गलती है कि ईवेंट हैंडलर्स को नहीं हटाया जाए जो ऑब्जेक्ट की सदस्यता लें। एक ईवेंट हैंडलर सदस्यता ऑब्जेक्ट को पुनर्नवीनीकरण से रोकेगी। साथ ही, प्रयोग करने वाले वक्तव्य पर एक नज़र डालें जो आपको एक संसाधन के जीवनकाल के लिए सीमित दायरे बनाने की अनुमति देता है।

इस ब्लॉग में कुछ प्रकार के अद्भुत स्मृतियां हैं जिन्हें हर तरह की मेमोरी लीक को ट्रैक करने के लिए विंडबैग और अन्य टूल का इस्तेमाल किया गया है। अपने कौशल को विकसित करने के लिए उत्कृष्ट पढ़ने

मेरी खिड़की सेवा में एक मेमोरी रिसाव था, जो मैंने तय किया था।

सबसे पहले, मैंने MemProfiler की कोशिश की मुझे इसका उपयोग करना बहुत कठिन है और सभी उपयोगकर्ता के अनुकूल नहीं है

इसके बाद, मैंने जस्ट टी्रेस का इस्तेमाल किया जो कि प्रयोग में आसान है और आपको उन वस्तुओं के बारे में अधिक जानकारी प्रदान करता है जिन्हें सही तरीके से निपटारा नहीं किया गया है

यह मुझे वास्तव में आसानी से स्मृति रिसाव को हल करने की अनुमति दी।

यदि आप लीक देख रहे हैं तो एक पलायन कैश के कार्यान्वयन के कारण, यह एक ऐसा परिदृश्य है जहां आप कमर के उपयोग पर विचार करना चाह सकते हैं। इससे यह सुनिश्चित करने में सहायता मिल सकती है कि जब भी आवश्यक हो, तब स्मृति को रिलीज़ किया जाता है।

हालांकि, आईएमएचओ बीएसपीओ समाधान पर विचार करना बेहतर होगा – केवल आप वास्तव में जानते हैं कि ऑब्जेक्ट को कितनी देर तक रखने की आवश्यकता है, इसलिए आपकी स्थिति के लिए उपयुक्त गृह कोडिंग डिजाइन करना सबसे अच्छा तरीका है

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

स्लाइडिंग समाप्ति के साथ कैश प्रदाता का उपयोग करने के लिए उपयोग करें, ताकि अगर किसी वांछित समय खिड़की के लिए संदर्भित न हो जाए तो यह dereferenced और साफ हो जाता है लेकिन अगर इसे बहुत तक पहुंचा जा रहा है तो यह स्मृति में कहेंगे

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

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

फिर ऑफ़लाइन का विश्लेषण करें

बड़ी बंदूकें – विंडोज के लिए डिबगिंग टूल्स

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

"यदि यह टूटा हुआ है …" ब्लॉग में इस विषय पर बहुत उपयोगी लेख हैं।

प्रबंधित अनुप्रयोग के लिए मेरे एक फिक्स के बाद मेरे पास एक ही बात थी, जैसे कि मेरे आवेदन में मेरे अगले परिवर्तन के बाद एक ही मेमोरी रिसाव नहीं होगा, इसलिए मैंने ओबिलिटी रिलीज सत्यापन ढांचे की तरह कुछ लिखा है, कृपया एक नज़र डालें NuGet पैकेज ऑब्जेक्ट रिलेइज़िफिकेशन आप यहां एक नमूना पा सकते हैं https://github.com/outcoldman/OutcoldSolutions-ObjectReleaseVerification- नमूना, और इस नमूने के बारे में जानकारी http://outcoldman.ru/en/blog/show/322